获取模板化对象方法的 Return 类型
Getting the Return Type of a Templatized Object's Method
说我有:
template <typename T>
struct Foo {
T& func();
};
我实现了一个Foo
:Foo<int> bar
现在我想获得bar.func()
的return类型。我一直试图强迫 result_of
与我一起工作,但无济于事。
我真正想要的是能够做到 result_of_t<foo.func>
并完成它,但我想这要困难得多?我应该如何获得这种 return 类型?
编辑:
我希望在不考虑 bar
声明方式的情况下完成此操作。也就是说,我只想能够将 bar.func
传递给 result_of
或类似的东西,然后输出 return 类型。
std::result_of
实际上用起来很烦人。它的语法是:
result_of<F(ArgTypes...)>
其中 F
是可调用的东西,这里的一切都是类型。在你的例子中,你想要调用一个成员函数:&Foo<int>::func
。但这不是您需要的指向成员的指针的 value ,而是类型。所以我们想要decltype(&Foo<int>::func)
。调用成员函数的方法是传递一个对象的实例作为第一个参数。
把它们放在一起,我们得到:
using T = std::result_of_t<decltype(&Foo<int>::func)(Foo<int>&)>;
static_assert(std::is_same<T, int&>::value, "!");
或者我们可以只使用 decltype
:
using T = decltype(std::declval<Foo<int>&>().func());
这更自然。
鉴于 bar
,这只是:
using T = decltype(bar.func());
相对于:
using T = std::result_of_t<decltype(&decltype(bar)::func)(decltype(bar))>;
说我有:
template <typename T>
struct Foo {
T& func();
};
我实现了一个Foo
:Foo<int> bar
现在我想获得bar.func()
的return类型。我一直试图强迫 result_of
与我一起工作,但无济于事。
我真正想要的是能够做到 result_of_t<foo.func>
并完成它,但我想这要困难得多?我应该如何获得这种 return 类型?
编辑:
我希望在不考虑 bar
声明方式的情况下完成此操作。也就是说,我只想能够将 bar.func
传递给 result_of
或类似的东西,然后输出 return 类型。
std::result_of
实际上用起来很烦人。它的语法是:
result_of<F(ArgTypes...)>
其中 F
是可调用的东西,这里的一切都是类型。在你的例子中,你想要调用一个成员函数:&Foo<int>::func
。但这不是您需要的指向成员的指针的 value ,而是类型。所以我们想要decltype(&Foo<int>::func)
。调用成员函数的方法是传递一个对象的实例作为第一个参数。
把它们放在一起,我们得到:
using T = std::result_of_t<decltype(&Foo<int>::func)(Foo<int>&)>;
static_assert(std::is_same<T, int&>::value, "!");
或者我们可以只使用 decltype
:
using T = decltype(std::declval<Foo<int>&>().func());
这更自然。
鉴于 bar
,这只是:
using T = decltype(bar.func());
相对于:
using T = std::result_of_t<decltype(&decltype(bar)::func)(decltype(bar))>;