基于用户定义的输入类型类别的C++函数调度(C++11/14友好)

问题描述 投票:0回答:1

我想根据用户定义的输入类型“标签”来调度函数。例如,我定义了一个名为

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;
}

编辑: 有人不喜欢我使用“特质”这个词,我会用标签代替这个词,看起来更合适以避免混淆。

c++ c++11 templates sfinae
1个回答
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{};

演示

© www.soinside.com 2019 - 2024. All rights reserved.