代码之家  ›  专栏  ›  技术社区  ›  Xiyang Liu

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

  •  0
  • Xiyang Liu  · 技术社区  · 1 年前

    我想根据用户定义的输入类型的“标记”来调度函数。例如,我定义了一个名为 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重新替换这个词,似乎更适合避免混淆。

    1 回复  |  直到 1 年前
        1
  •  0
  •   Jarod42    1 年前

    只需添加的专业化 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{};
    

    Demo

    请注意,如果您的类型为( Hidden对象 )匹配多个专业。