我有这段代码:
struct Foo
{
int print(int a, double b);
int print(int a);
void print();
void print(int a, int b, int c);
void other();
};
我可以打电话
decltype(&Foo::other)
但是打电话
decltype(&Foo::print)
以错误结束,这对我来说很清楚。
但我怎样才能更明确地指出""我想要解析为print
的四种decltype
方法中的哪一种?
我想在
中进一步使用它template <class MT>
struct method_info;
template <class T, class Res, class... Args>
struct method_info<Res(T::*)(Args...)>
{
typedef std::tuple<Args&&...> args_tuple;
typedef T ClassType;
typedef Res RetVal;
};
template <class MethodType>
void func() {
typedef method_info<MethodType> MethodInfo;
.....
}
func<decltype(&Foo::other)>();
....
答案 0 :(得分:5)
据我了解,更“紧密”意味着您要指定print
的函数参数。也就是说,例如,您选择int, int
,然后返回Foo{}.print(int{},int{})
的结果类型,然后从所有可用信息构造一个函数指针。
这是一个别名模板,它以一般方式为您执行此操作:
template<typename ... Args>
using ptr_to_print_type = decltype(std::declval<Foo>().print(std::declval<Args>() ...)) (Foo::*)(Args ...);
您也可以使用std::result_of
代替std::declval
内容,但我更喜欢后者。
您可以将上述内容用作
func<ptr_to_print_type<int,int> >();
编辑:正如@JavaLover所要求的那样,对于如此可怕的C ++狗屎而言,这似乎是一个不合适的名字:-),这里使用的是std::result_of
(//------ does not compile for overloaded functions --------
template<typename ... Args>
using ptr_to_print_type = std::result_of_t<decltype(&Foo::print)(Foo, Args ...)> (Foo::*)(Args ...)
//------ does not compile for overloaded functions --------
你可以进一步抽象出Foo
而不是print
(除非你使用的是宏)。
答案 1 :(得分:3)
不确定确切的语法,但是在方法名称重载的情况下,你应该转换指针;
之类的东西static_cast<void(Foo::*)(int, int, int)>(&Foo::print);
在你只对类型感兴趣时,应该是演员的模板值
void(Foo::*)(int, int, int)