Я не совсем уверен, о чем вы спрашиваете, но вы могли бы использовать параметр шаблона нетипичного типа, например, чтобы определить шаблон функции, который добавляет любую константу времени компиляции к ее аргументу:
template <int N>
inline int add(int x)
{
return x + N;
}
int main()
{
std::cout << add<3>(2) << std::endl; // prints 5
std::cout << add<4>(2) << std::endl; // prints 6
}
Чтобы ответить на ваш конкретный вопрос о том, почему sq(2)
компилируется, а add(&x)
нет: параметры типа шаблонов функций могут быть выведены из аргументов функции. Так что sq(2)
эквивалентно sq<int>(2)
. Нетипичные параметры не могут быть выведены, поэтому вы должны предоставить один. В случае параметра указателя аргумент должен быть указателем на переменную с внешней связью, поэтому следует скомпилировать следующее:
int global;
int main() {
int local = 2;
std::cout << add<&global>(&local) << std::endl;
}