我想根据用户定义的输入类型的“标记”来调度函数。例如,我定义了一个名为
SomeSpecificObjectType
在课堂上
Object
我将该类标记为
某些特定对象类型
.
struct SomeSpecificObjectType{};
template<typename T>
class Object
{
public:
Object(T&&in): m_data(in){};
typedef SomeSpecificObjectType ObjectTag;
T m_data;
};
现在我有另一个对象,它不共享此标记。所以我不碰它。
template<typename T>
class OtherObject
{
public:
OtherObject(T&&in): m_data(in){};
T m_data;
};
现在我定义一个结构来检查上面定义的标记。
template<typename T, typename Enable=void>
struct is_some_specific_object_type
{
static constexpr bool value = false;
};
template<typename T>
struct is_some_specific_object_type<T, typename std::enable_if<std::is_same<typename T::ObjectTag, SomeSpecificObjectType>::value>::type>
{
static constexpr bool value = true;
};
我的功能:
template<typename T, typename std::enable_if<!is_some_specific_object_type<T>::value>::type* = nullptr>
void some_func(const T & data)
{
std::cout <<"something" <<std::endl;
}
template<typename T, typename std::enable_if<is_some_specific_object_type<T>::value>::type* = nullptr>
void some_func(const T & data)
{
std::cout <<"something else" << std::endl;
}
这似乎奏效了。
然而,想象一下,我有一个类,它的定义对我来说是隐藏的(
HiddenObject
)-这意味着我无法添加“标签”
某些特定对象类型
到这个班。本质上我想要
is_some_specific_object_type::value == true
为了这个
Hidden对象
.有没有办法做到这一点而不耽误上课
Hidden对象
template<typename T>
class HiddenObject
{
public:
HiddenObject(T&&in): m_data(in){};
T m_data;
};
最终期望结果:
int main()
{
Object obj(123);
OtherObject o_obj(123);
some_func(obj);
some_func(o_obj);
//HiddenObject h_obj(123);
//some_func(h_obj); ---> print "something else"
return 0;
}
Eddit
:
有人不喜欢我用了“trait”这个词,我会用Tag重新替换这个词,似乎更适合避免混淆。