如何在不创建实例的情况下获取类的方法成员的类型?

Mak*_*gan 4 c++ arrays generics templates types

假设我们有:

template <typename T>
void foo(std::vector<T> &t) {
    auto var = T();
    std::vector<decltype(var.Get())> array;
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,创建了一个数组。该数组的类型是Get()的返回值是什么。通过创建类型T的虚拟变量,然后使用decltype推断Get的返回类型,可以找到此值。

这是可行的,但是它需要创建一个无用的伪变量。

相反,我们可以这样做:

template <typename T>
void foo(std::vector<T> &t) {
    auto var = t[0];
    std::vector<decltype(var.Get())> array;
}
Run Code Online (Sandbox Code Playgroud)

不会创建任何虚拟变量,但是鉴于我们不能保证数组至少包含on元素,这可能会崩溃。

有没有一种方法可以推断.Get()的类型而不创建虚拟对象?

Vit*_*meo 10

std::vector<decltype(t[0].Get())>
Run Code Online (Sandbox Code Playgroud)

t[0]不会像decltype未评估的上下文一样被调用。

备择方案:

std::vector<decltype(T().Get())>
std::vector<decltype(std::declval<T&>().Get())>
Run Code Online (Sandbox Code Playgroud)