推导指向成员函数模板参数的指针的参数类型
Deduce parameter type of pointer to member function template parameter
我正在尝试用一个 void (Foo::*FUNC)(T const *)
类型的模板参数编写一个 C++ 函数模板 f
,其中 Foo
是某种 class 类型。此外,我想从为 FUNC
指定的具体成员函数指针中推导出 T
。所以一个想法是:
template<typename T, void(Foo::*FUNC)(T const *)>
void f()
{ /* use T in here, e.g. if constexpr (std::is_same_v<T, int>) */ }
但是我必须在实例化 f
时明确指定 T
并且不能只写例如f<&Foo::bar>
。我知道有一些方法可以推断函数第一个参数的类型,但它们都过于复杂(不使用 Boost)。有没有更聪明的方法来做我想做的事?
这是一个从成员函数指针中提取参数的特征,看起来像您期望的那样:
namespace detail {
template<typename M> struct extract_arg;
template<typename R, class C, typename A>
struct extract_arg<R (C::*)(A const*)> { using type = A; }
}
这里是一个 C++17 函数模板,它有一个非类型模板参数,其类型是从占位符推导出来的:
template<auto FUNC>
void f()
{
static_assert(std::is_member_function_pointer_v<decltype(FUNC)>);
using T = typename detail::extract_arg<decltype(FUNC)>::type;
T t{};
}
它使用 std::is_member_function_pointer
来检查它确实是正确的类型(好吧,类型族),然后我们的辅助特征提取 T
.
我正在尝试用一个 void (Foo::*FUNC)(T const *)
类型的模板参数编写一个 C++ 函数模板 f
,其中 Foo
是某种 class 类型。此外,我想从为 FUNC
指定的具体成员函数指针中推导出 T
。所以一个想法是:
template<typename T, void(Foo::*FUNC)(T const *)>
void f()
{ /* use T in here, e.g. if constexpr (std::is_same_v<T, int>) */ }
但是我必须在实例化 f
时明确指定 T
并且不能只写例如f<&Foo::bar>
。我知道有一些方法可以推断函数第一个参数的类型,但它们都过于复杂(不使用 Boost)。有没有更聪明的方法来做我想做的事?
这是一个从成员函数指针中提取参数的特征,看起来像您期望的那样:
namespace detail {
template<typename M> struct extract_arg;
template<typename R, class C, typename A>
struct extract_arg<R (C::*)(A const*)> { using type = A; }
}
这里是一个 C++17 函数模板,它有一个非类型模板参数,其类型是从占位符推导出来的:
template<auto FUNC>
void f()
{
static_assert(std::is_member_function_pointer_v<decltype(FUNC)>);
using T = typename detail::extract_arg<decltype(FUNC)>::type;
T t{};
}
它使用 std::is_member_function_pointer
来检查它确实是正确的类型(好吧,类型族),然后我们的辅助特征提取 T
.