是否可以使用std :: enable_if选择成员模板专业化
Is it possible to use std::enable_if to select a member template specialization?
给定类声明
class A {
template <typename T> T foo();
};
我想专门针对T
的各种类型(int
,...)和类型类(POD,非POD)的A::foo
。不幸的是,我似乎无法将std::enable_if
用于后者。以下没有编译:
template <> int A::foo<int>(); // OK
template <typename T>
typename std::enable_if<is_pod<T>::value, T>::type foo(); // <<<< NOT OK!
template <typename T>
typename std::enable_if<!is_pod<T>::value, T>::type foo(); // <<<< NOT OK!
问题可能是由于std::enable_if<...>
的内容是功能签名的一部分,并且我没有在A
中声明任何此类成员。那么如何根据类型特征专业化模板成员?
我没有理由在这里专业,超载该功能在我的脑海中似乎就足够了。
struct A
{
template <typename T>
typename std::enable_if<std::is_integral<T>::value, T>::type foo()
{
std::cout << "integral" << std::endl;
return T();
}
template <typename T>
typename std::enable_if<!std::is_integral<T>::value, T>::type foo()
{
std::cout << "not integral" << std::endl;
return T();
}
}
检查POD或没有POD时,您只有这两种选择,因此不需要更通用的功能(并且不允许,因为这是模棱两可的)。您还需要更多吗?您可以在std::enable_if<std::is_same<int, T>::value, T>::type
的帮助下检查不专业的明确类型。
我只是将其转发到一个结构,该结构确实可以很好地处理:
#include <type_traits>
#include <iostream>
template <typename T, typename = void>
struct FooCaller;
class A {
public:
template <typename T>
T foo() {
// Forward the call to a structure, let the structure choose
// the specialization.
return FooCaller<T>::call(*this);
}
};
// Specialize for PODs.
template <typename T>
struct FooCaller<T, typename std::enable_if<std::is_pod<T>::value>::type> {
static T call(A& self) {
std::cout << "pod." << std::endl;
return T();
}
};
// Specialize for non-PODs.
template <typename T>
struct FooCaller<T, typename std::enable_if<!std::is_pod<T>::value>::type> {
static T call(A& self) {
std::cout << "non-pod." << std::endl;
return T();
}
};
// Specialize for 'int'.
template <>
struct FooCaller<int> {
static int call(A& self) {
std::cout << "int." << std::endl;
return 0;
}
};
相关文章:
- 根据模板类型选择类模板的成员类型?
- c++ 如何选择具有相同名称的成员函数?
- 在运行时选择类成员的类型
- C++ 将派生类的成员函数指针作为参数传递时选择了错误的模板专用化
- 使用 SFINAE 有选择地实例化模板的成员函数
- 使用 std::条件根据模板参数选择成员类型
- 根据模板参数可以选择静态的类成员
- 有选择地隐藏类成员的成员
- 动态更改/选择类成员变量的类型
- 我可以指定或选择类的成员(并将其用作参数)吗?
- 成员变量的初始化必须延迟。此类的最佳设计选择是什么?
- 为什么在指针上对成员访问/元素选择有不同的运算符
- 重载成员选择运算符
- 迭代器重载成员选择与间接运算符
- 关于智能指针中取消引用和成员选择运算符的定义
- iOS中箭头成员选择运算符的使用
- 具有重载的取消引用运算符的成员选择
- Visual C++ 使用成员选择运算符(. 或 –>)访问静态成员函数
- C++指针赋值和箭头成员选择运算符
- 任意对象成员选择C++