在下面的代码中,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;
}
答案 0 :(得分:6)
您可以使用以下内容执行此操作:
#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
,但对于前C ++ 11也有类似的提升。
答案 1 :(得分:1)
考虑一下:
#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;
}