到目前为止,我已经能够通过名称检测某个函数是否存在,而不需要其签名,如下所示:
严格遵循一段代码"启发"通过这个问题的答案:Is it possible to figure out the parameter type and return type of a lambda?
我知道应该为不同的修饰符创建不同的专门化,例如const成员函数。
template <typename T, typename TReturn, typename... Args>
struct function_traits<TReturn( T::* )( Args... )>
{
using return_type = TReturn;
using arguments = std::tuple<Args...>;
static std::size_t constexpr arg_count = sizeof...( Args );
template <std::size_t N, typename = void>
struct argument
{
using type = std::tuple_element_t<N, arguments>;
};
template <std::size_t N>
struct argument<N, std::enable_if_t<( !( N < arg_count ) ), void>> {};
};
我自己的代码作为 28.4.4 的 C ++编程语言,第4版的解决方法,因为我使用 VC ++ 2015
template <typename T>
struct has_func_f
{
private:
template <typename C, typename = void>
struct get_result
{
static bool constexpr value = false;
};
// need <function_name> as a class parameter so I can append and get &C::<function_name>
template <typename C>
struct get_result<C, std::enable_if_t<( std::is_same<decltype( ( decltype( std::declval<typename function_traits<decltype( &C::f )>::arguments>() ) ) ( std::declval<typename function_traits<decltype( &C::f )>::arguments>() ), std::true_type() ), std::true_type>::value ), void>>
{
static bool constexpr value = true;
};
public:
static bool constexpr value = get_result<T>::value;
};
只要名称匹配,此代码就可用于检测任何函数签名。我的示例用法:
struct A {};
struct B { float f(int, double); };
struct C { void f(); };
int main()
{
has_func_f<A>::value; // false
has_func_f<B>::value; // true
has_func_f<C>::value; // true
return 0;
}
正如我的问题所述,我怎么可能做我想做的事情?我已经查看并查看了,我最接近的是使用宏来为我想要的函数名生成适当的结构。还有其他办法吗?