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

时间:2016-03-08 14:52:40

标签: c++ templates sfinae

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

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,这需要我将参数传递给模板参数,如果它是0,则会使用SFINAE来禁用它。

但是在API中暴露这样的东西感觉反直觉。有一些解决方法吗?

(是的,我可以使用例外而不是,甚至可能更好的想法,但我现在正在学习SFINAE,并想知道它的限制在哪里)

2 个答案:

答案 0 :(得分:1)

如果你的论点在编译时是已知的,你甚至不需要sfinae来检查 - 一个简单的assert将提供更好的诊断。

但是,如果参数未知(更可能是场景),则不能使其成为模板参数,并且必须使用异常或返回错误代码来指示提供的参数不在支持的域中。

答案 1 :(得分:-1)

将模板视为与#define

相同的smth

如果你想使用4作为模板参数,它大致是

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

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