使用模板参数作为函数参数
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 错误代码来指示提供的参数在外部支持的域。
我可以用函数参数推断模板参数
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 错误代码来指示提供的参数在外部支持的域。