使用模板参数作为函数参数

Using template parameters as function parameters

我可以用函数参数推断模板参数

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,想知道它的限制在哪里)

认为模板与#define 一样

如果要使用4作为模板参数,大致是

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

您可以快速查看 Alexandrescu 的 C++ 书籍以获得更长时间的讨论,即如何在模板参数中使用值。

如果您的参数在编译时已知,您甚至不需要 sfinae 进行检查 - 一个简单的 assert 将提供更好的诊断。

但是,如果参数未知(这是更有可能的情况),那么您不能将其作为模板参数,并且您必须使用异常或 return 错误代码来指示提供的参数在外部支持的域。