我使用命名空间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成员函数。
当前它适用于包括模板函数在内的所有函数,但是当模板函数参数为枚举时失败。
非常感谢。