use*_*257 6 c++ templates class enable-if c++11
我有以下不编译的代码.这是接受参数的模板类中的两个函数
typename std::enable_if<std::is_void<Ret>::value, Ret>::type _on_dispatched() {
// ...
}
typename std::enable_if<!std::is_void<Ret>::value, Ret>::type _on_dispatched() {
// ....
}
Run Code Online (Sandbox Code Playgroud)
我希望根据Ret的类型对成员方法进行专门化.
有人有点想法吗?
SFINAE不适用于非模板功能(成员或非成员).
正如Kerrek SB指出的那样,使它们成为非成员函数模板将起作用.或者正如Xeo指出的那样,使用带有默认模板参数的成员函数模板也可以工作.
但是,这只能起作用,因为这两个std::enable_if条件不重叠.如果你想为int(比如说)添加不同的重载,那么你会发现它不能很好地扩展.根据您的要求,标签调度通常比SFINAE更好地扩展,您可以使用多个备选方案进行调度:
#include<type_traits>
template<typename Ret>
class Foo
{
public:
void _on_dispatched()
{
// tag dispachting: create dummy of either std::false_type or std::true_type
// almost guaranteed to be optimized away by a decent compiler
helper_on_dispatched(std::is_void<Ret>());
}
private:
void helper_on_dispatched(std::false_type)
{
// do stuff for non-void
}
void helper_on_dispatched(std::true_type)
{
// do stuff for void
}
};
int main()
{
Foo<void>()._on_dispatched();
Foo<int>()._on_dispatched();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1765 次 |
| 最近记录: |