使用检测惯用法检测采用强枚举参数的模板类成员函数

时间:2019-06-10 17:51:51

标签: c++ object-detection typetraits

我使用命名空间W_ASL_is_detected_exact下面的代码来检测,键入特征。 它应该执行与std :: experimental :: is_detected相同的操作,但是我使用此代码会导致std :: experimental在Visual Studio MSVC中不可用。

对于包括模板功能在内的所有功能均可完美运行。 但是无法检测使用枚举模板参数的模板函数

namespace W_ASL_is_detected_exact
        {
            template< class... >
            using void_t = void;

            struct nonesuch {
                nonesuch() = delete;
                ~nonesuch() = delete;
                nonesuch(nonesuch const&) = delete;
                void operator=(nonesuch const&) = delete;
            };

            namespace detail {
                template <class Default, class AlwaysVoid,
                    template<class...> class Op, class... Args>
                struct detector {
                    using value_t = std::false_type;
                    using type = Default;
                };

                template <class Default, template<class...> class Op, class... Args>
                struct detector<Default, void_t<Op<Args...>>, Op, Args...> {
                    using value_t = std::true_type;
                    using type = Op<Args...>;
                };

            } // namespace detail

            template <template<class...> class Op, class... Args>
            using is_detected = typename detail::detector<nonesuch, void, Op, Args...>::value_t;

            template <template<class...> class Op, class... Args>
            using detected_t = typename detail::detector<nonesuch, void, Op, Args...>::type;

            template <class Default, template<class...> class Op, class... Args>
            using detected_or = detail::detector<Default, void, Op, Args...>;
        }//W_ASL_is_detected_exact

        template <class Expected, template<class...> class Op, class... Args>
        using ASL_is_detected_exact = std::is_same<Expected, W_ASL_is_detected_exact::detected_t<Op, Args...>>;

可以很好地检测给定类型T中的函数。

这是包含我要检测的功能的测试类

enum class E_ClsState :unsigned int
            {
                e1,e2,e3
            };

     class CTestClass
    {
         template<int iVal>
         void TestFunc_Int()
         {

         }

         template<E_ClsState clsSate>
         void TestFunc_Enum()
         {

         }


    }

这是进行检测的特征检查模板类

  template<class T_IStateParent>
    class SPT_IStateParent_T :
    {
        //describe trait for TestFunc_int
        template<class t_IStateParent>
        using t_has_TestFunc_int = decltype(
            std::declval<t_IStateParent&>().template TestFunc_int< 1 >()
                        );
        //create function to test for TestFunc_int
        static constexpr bool Check_TestFunc_int()
        {
            return ASL_is_detected_exact<
            void,
            t_has_TestFunc_int,
            T_IStateParent
            >{};

        }

    //describe trait for TestFunc_enum
    template<class t_IStateParent>
        using t_has_TestFunc_enum = decltype(
        std::declval<t_IStateParent&>().template TestFunc_enum<E_ClsState::e1>()
                        );

         //create function to test for TestFunc_enum
        static constexpr bool Check_TestFunc_enum()
        {
            return ASL_is_detected_exact<
            void,
            t_has_TestFunc_enum,
            T_IStateParent
            >{};

        }

        //This is equivalent of main for this test
        //consume type traits here using static_assert 
        SPT_IStateParent_T ()
       {  
           //T_IStateParent here is class CTestClass 

          static_assert(Check_TestFunc_int())//this works
           static_assert(Check_TestFunc_enum())//this fails
       }


    }

问题是我需要帮助来了解如何使用此API来检测参数为强类型枚举的Template成员函数。

当前它适用于包括模板函数在内的所有函数,但是当模板函数参数为枚举时失败。

非常感谢。

0 个答案:

没有答案