枚举类型参数的专用成员模板
Specializing member template for enum type arguments
在下面的代码中,Foo<T>::setValue
很好地满足我的目的,除非T
是名为TYPE
的类枚举,例如 Bar::TYPE
和Baz:TYPE
.
因此,我希望帮助专门Foo<T>::setValue
而不命名Bar
和Baz
,因为可能有几十个这样的类。
class Bar
{
public:
enum TYPE{ ONE , TWO };
};
class Baz
{
public:
enum TYPE{ SIX , TEN };
};
template<typename T>
class Foo
{
public:
void setValue(){} // Need a different setValue if T is a class enum
private:
T m_value;
};
int main()
{
Foo<int> f1;
Foo<Bar::TYPE> f2;
Foo<Baz::TYPE> f3;
return EXIT_SUCCESS;
}
你可以这样做:
#include <type_traits>
template<typename T>
class Foo
{
public:
void setValue() {
setValueImpl<T>();
}
private:
template <class X>
typename std::enable_if<std::is_enum<X>::value, void>::type
setValueImpl() { std::cout << "Is enum" << std::endl; }
template <class X>
typename std::enable_if<!std::is_enum<X>::value, void>::type
setValueImpl() { std::cout << "Not enum" << std::endl; }
T m_value;
};
其中,enable_if
根据is_enum
类型特征选择要使用的版本。
该示例使用 C++11 enable_if
和 is_enum
但 boost 对于 C++11 之前也有类似的效果。
考虑一下:
#include <iostream>
class Bar
{
public:
enum TYPE{ ONE , TWO };
};
class Baz
{
public:
enum TYPE{ SIX , TEN };
};
template<typename T>
class Foo
{
public:
template<typename C> void setValue(const C &m_value, ...)
{
std::cout << "normal" << std::endl;
}
template<typename C> void setValue(const C &m_value, typename C::TYPE fake = C::TYPE())
{
std::cout << "TYPE'ed" << std::endl;
}
private:
T m_value;
};
int main()
{
Foo<int> f1;
Foo<Bar> f2;
Foo<Baz> f3;
f1.setValue(1);
f2.setValue(Bar());
f3.setValue(Baz());
return 0;
}
相关文章:
- 静态数据成员模板专用化的实例化点在哪里
- 成员变量如何使用专用类模板?
- GCC 7 中模板类的模板成员函数的专用化
- C++ 类模板部分专用化,而不专用化所有成员函数
- 专用于可变参数模板成员函数
- 对专用模板成员的未定义引用
- 对类模板成员的显式专用化的约束
- 类模板成员函数的专用化
- C++ 将派生类的成员函数指针作为参数传递时选择了错误的模板专用化
- 类成员函数的函数模板专用化
- '将成员函数仅添加到类的专用模板
- 静态数据成员的模板专用化
- 在实例化封闭类模板之后,我们可以声明模板类成员的部分专用化吗
- 如何部分专用化非成员和成员函数指针的结构模板
- 如何将类成员专用于多个模板值(常量)?
- 模板类中的模板成员专用化
- "expected initializer before '<' token"尝试模板成员专用化
- 模板化子类和模板化基类的静态成员专用化
- 数组的部分模板成员专用化
- 头中没有声明的模板类成员专用化