2016-03-08 7 views
0

можно вывести параметры шаблона с параметрами функцииИспользование параметров шаблона в качестве параметров функции

template <typename T> 
void f(T a) 
{ /* */ } 

f(4); // T inferred to be `int` 

Однако я не могу использовать параметры функции, чтобы вывести параметры шаблона, которые не являются типы:

template <int I> 
void g(int I) // error: declaration of 'I' shadows template parameter 
{ /* */ } 

Предположим, я хочу написать функцию divive_dy_2(int number), и я хочу убедиться, что number не равен нулю.

I've seen a very simple way to do this, что потребовало бы мне передать аргумент параметра шаблона, который затем будет использовать SFINAE, чтобы отключить его, если он был 0.

Но он чувствует себя нелогичным, чтобы выставить что-то подобное в API. Есть ли способ обхода?

(И да, я мог бы использовать исключения и то, что нет, то, возможно, даже лучшая идея, но я учусь SFINAE в данный момент и хотите знать, где это пределы)

+6

Параметр шаблона должен быть известен во время компиляции. Значение аргумента (в отличие от его типа) неизвестно до времени выполнения. Аналогично, SFINAE работает во время компиляции. Разве вы не можете использовать его, чтобы каким-то образом воздействовать на значение, которое становится известно только во время выполнения. В принципе, если у меня есть int; cin >> x; g (x); ', вы ожидаете, что этот код волшебным образом не скомпилируется сейчас, если пользователь будет вводить' 0' в будущем, но скомпилируется успешно, если она наберет «1». –

+0

«Однако я не могу использовать параметры функции для вывода параметров шаблона, которые не являются типами:'. Ну, вы можете; [например] (http://ideone.com/KuoWnb) – Lol4t0

+0

Вы можете взять 'std :: integ_constant' в качестве аргумента и использовать пользовательские литералы, чтобы сделать звонок более приятным. Однако вы можете использовать аргументы шаблона. – TartanLlama

ответ

1

Если ваш аргумент известен во время компиляции, вам даже не нужно sfinae для вашей проверки - простой assert обеспечит гораздо лучшую диагностику.

Однако, если аргумент неизвестен (что более вероятно, сценарий), чем вы не можете сделать его аргументом шаблона, и вы должны использовать исключения или вернуть код ошибки, чтобы указать, что предоставленный аргумент находится за пределами поддерживаемого домена.

-1

Думай шаблона, как SMTH же, как #define

Если вы хотите использовать 4 в качестве аргумента шаблона, это примерно

template <int I> 
void g() 
{ ... here use I as _value_, not type} 

вы можете быстро найти в книге Alexandrescu в C++ для более обсуждения, как использовать значения в ТЕМ табличные аргументы.

+0

Почему вы сбиваете с толку людей? Шаблоны ** не ** что-то определяют. – SergeyA

+0

Это помогает думать о них как о компиляции, _as_ #define. – rezdm

Смежные вопросы