如何使用enable_if根据类的模板参数启用成员函数
在代码中:
template<class T>
struct is_builtin
{
enum {value = 0};
};
template<>
struct is_builtin<char>
{
enum {value = 1};
};
template<>
struct is_builtin<int>
{
enum {value = 1};
};
template<>
struct is_builtin<double>
{
enum {value = 1};
};
template<class T>
struct My
{
typename enable_if<is_builtin<T>::value,void>::type f(T arg)
{
std::cout << "Built-in as a param.\n";
}
typename enable_if<!is_builtin<T>::value,void>::type f(T arg)
{
std::cout << "Non - built-in as a param.\n";
}
};
struct A
{
};
int main()
{
A a;
My<int> m;
My<A> ma;
m.f(1);
ma.f(a);
return 0;
}
我收到错误:
error C2039: 'type' : is not a member of 'std::tr1::enable_if<_Test,_Type>'
显然我不明白如何使用enable_if
。我的想法是,我可以在编译期间启用一组成员函数中的一个或第二个成员函数,但它不起作用。谁能向我解释一下如何正确执行此操作?
已编辑
我真正无法理解的是为什么其中一个 def 中没有 typedef
。编译器找不到它并且不会编译它。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
您不能使用类模板参数来获取成员函数的 SFINAE。
您需要
使成员函数成为成员函数模板,并在成员函数模板的模板参数上使用
enable_if
,或者将成员函数
f
移动到策略类中,并使用enable_if
专门化类模板。< /p>You can't use class template parameters to get SFINAE for member functions.
You either need to
make the member function a member function template instead and use
enable_if
on the member function template's template parameters ormove the member function
f
into a policy class and specialize the class template usingenable_if
.它的工作原理如下(请注意,为了方便起见,我用
std::is_arithmetic
替换了您的is_builtin
特征,并使用了更多 C++11 内容,但它无论如何都可以工作):< a href="http://coliru.stacked-crooked.com/a/3dfb1fb7c5e78e02" rel="nofollow noreferrer">DEMO
关键部分是将模板参数带入直接上下文 通过使用默认函数模板参数
T_
,它等于类模板参数T
。有关更多详细信息,请参阅此问题。Here's how it works (note that for convenience I replaced your
is_builtin
trait withstd::is_arithmetic
and used further C++11 stuff, but it works any way):DEMO
The crucial part is to bring the template parameter into the immediate context by using a default function template parameter
T_
which equals the class template parameterT
. For more details, see this question.您可以使用修改后的enable_if来修复代码
使用示例:
You can fix your code by using modified enable_if
Example of usage:
enable_if 需要一个元函数。要使用布尔值,您需要enable_if_c。我很惊讶你在解释这个问题时没有遇到错误。
您可以通过在内部声明一个“类型”typedef 来修复您的元函数,该类型定义本身就是它本身。然后您可以使用
boost::enable_if>::type
enable_if expects a metafunction. To use a bool you need enable_if_c. I'm surprised you're not getting errors explaining THAT problem.
You can fix your metafunction by declaring a 'type' typedef inside that is simply itself. Then you can use
boost::enable_if<is_builtin<T>>::type