Почему вы не можете определить новые типы в аргументе шаблона C ++? - PullRequest
2 голосов
/ 02 июня 2009

Я создаю библиотеку, позволяющую использовать OCaml / Haskell-подобные алгебраические типы данных и сопоставление с образцом. Алгебраические типы данных реализованы с использованием класса, аналогичного Boost.Variant . Я хотел бы иметь возможность определять новые типы (конструктор) в аргументах шаблона, но я получаю ошибку. Я использую свой собственный тип с шаблонами переменных, но я буду использовать Boost's variant здесь для простоты. Почему не так:

typedef variant <
    class Foo { ... },
    class Bar { ... }
> Baz;

разрешено? Я знаю, что могу определять типы отдельно, но это означает, что я не могу использовать некоторые хорошие макросы. В большинстве случаев в C ++ вам разрешено определять новый тип, в котором вы его используете, например:

struct Foo { ... } bar;

Здесь я определяю новый тип Foo и переменную bar типа Foo. Если такие вещи разрешены, то почему они не работают с шаблонами?

Ответы [ 3 ]

2 голосов
/ 02 июня 2009

На самом деле нет причины, за исключением того, что ее там нет, и я думаю, что ее не предлагали добавить или, если она была, не было достаточной поддержки.

Если вы хотите продолжить, я бы предложил начать с комитета по стандартам

http://www.open -std.org / ОТК1 / SC22 / wg21 /

1 голос
/ 02 июня 2009

Я думаю, это потому, что аргументы шаблона обрабатываются аналогично аргументам функции, и вы не можете объявить

void func( class A{} a, class B{} b );

либо. Я также думаю, что было бы невозможно подчиняться ODR , если вам нужны классы в более чем одном шаблоне (typedef).

0 голосов
/ 02 июня 2009

Я думаю, что ближайшие C ++ 0x Концепции довольно близки, хотя и не совсем совпадают с тем, что вы описываете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...