Olu*_*ide 2 c++ templates template-specialization
在下面的代码中,Foo<T>::setValue适用于我的目的,除非在哪里T是一个名为TYPEeg 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;
}
Run Code Online (Sandbox Code Playgroud)
您可以使用以下内容执行此操作:
#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;
};
Run Code Online (Sandbox Code Playgroud)
哪里enable_if根据is_enum类型特征选择使用哪个版本.
这个例子使用的是C++ 11 enable_if,is_enum但是对于前C++ 11也有类似的提升.