можно вывести параметры шаблона с параметрами функцииИспользование параметров шаблона в качестве параметров функции
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 в данный момент и хотите знать, где это пределы)
Параметр шаблона должен быть известен во время компиляции. Значение аргумента (в отличие от его типа) неизвестно до времени выполнения. Аналогично, SFINAE работает во время компиляции. Разве вы не можете использовать его, чтобы каким-то образом воздействовать на значение, которое становится известно только во время выполнения. В принципе, если у меня есть int; cin >> x; g (x); ', вы ожидаете, что этот код волшебным образом не скомпилируется сейчас, если пользователь будет вводить' 0' в будущем, но скомпилируется успешно, если она наберет «1». –
«Однако я не могу использовать параметры функции для вывода параметров шаблона, которые не являются типами:'. Ну, вы можете; [например] (http://ideone.com/KuoWnb) – Lol4t0
Вы можете взять 'std :: integ_constant' в качестве аргумента и использовать пользовательские литералы, чтобы сделать звонок более приятным. Однако вы можете использовать аргументы шаблона. – TartanLlama