我想根据用户定义的输入类型“标签”来调度函数。例如,我定义了一个名为
SomeSpecificObjectType
的标签,并在 Object
类中我将此类标记为 SomeSpecificObjectType
。
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
) - 这意味着我无法仅将“标签”SomeSpecificObjectType
添加到该类中。本质上我想要 is_some_specific_object_type::value == true
来实现这个 HiddenObject
。有没有办法在不编辑类的情况下做到这一点HiddenObject
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;
}
编辑: 有人不喜欢我使用“特质”这个词,我会用标签代替这个词,看起来更合适以避免混淆。
只需为
is_some_specific_object_type
添加 HiddenObject
的专业化:
template <typename T> struct is_HiddenObject : std::false_type {};
template <typename T> struct is_HiddenObject<HiddenObject<T>> : std::true_type {};
template<typename T>
struct is_some_specific_object_type<T, std::enable_if_t<is_HiddenObject<T>::value>> : std::true_type{};