Если вам нужен аргумент времени выполнения, используйте:
void foo(E m) {}
Имеет значение m
типа E
. (примечание: template<E m>
не требуется)
Если вам нужен аргумент времени компиляции, используйте:
template<E m>
void foo() {}
и звоните:
foo<A>();
Или, если вы хотите, чтобы foo
работал для всех типов перечислений:
template<typename E>
void foo(E m) {}
И, вероятно, проверьте перечисления с помощью
static_assert(std::is_enum<E>::value, "E is not an enumeration");
в теле функции. (Вы также можете использовать SFINAE для удаления foo
из набора перегрузки, если это необходимо, спросите, нужна ли вам помощь с этим)
Обновление: объяснение исходного кода и того, что с ним не так:
template<E m> void foo(E m) {}
// ^^^ (1) ^^^ (2)
(1) - это аргумент времени компиляции m
типа E
, (2) - это аргумент времени выполнения, также, который называется m
и также имеет тип E
. Поскольку у него то же имя, второй аргумент скрывает первый. Использование имени m
в вашей функции предоставит доступ только ко второму аргументу, а вы не сможете получить доступ к первому. Теперь рассмотрим:
template<E m1> void foo(E m2) {}
Теперь вы можете получить доступ к аргументам под разными именами, то есть m1
и m2
. Если вы вызываете функцию так:
foo<A>(B);
тогда m1
равно A
, а m2
равно B
. И все же оба относятся к одному и тому же фиксированному типу E
. Это независимые параметры, и значение параметра времени выполнения не будет использоваться для параметра времени компиляции.
В зависимости от того, какой тип или аргумент вам нужен (во время компиляции или во время выполнения), вы просто опускаете тот, который вам не нужен, и в итоге получаете одну из вышеуказанных реализаций.
Мне не на 100% ясно, где находится ваша настоящая проблема, что не является нетипичным для новичков, поскольку, по общему признанию, сложно описать проблему, которую вы действительно не понимаете, но убедитесь, что вы начинаете с понимания разницы между временем компиляции и параметры времени выполнения и способы их использования.
person
Daniel Frey
schedule
06.07.2015
void foo(E m)
. - person 0x499602D2   schedule 06.07.2015void foo(E m)
не является шаблонной функцией. - person nouney   schedule 06.07.2015