有没有办法对非可调用函数的结果进行decltype?

Gui*_*cot 3 c++ decltype c++11

我想知道是否有人有相同的技巧来找到find_me函数的返回类型,而不更改它的参数.

struct Stuck {
    Stuck() = delete;
    Stuck(Stuck&&) = delete;
    Stuck(const Stuck&) = delete;
    Stuck& operator=(Stuck&&) = delete;
    Stuck& operator=(const Stuck&) = delete;
};

double find_me(Stuck);

int main() {
    // This obviously don't work
    decltype(find_me(Stuck{})) test1;
}
Run Code Online (Sandbox Code Playgroud)

这是我试过的另一个镜头:

template<typename T>
struct ConvertTo {
    operator T ();
}

int main() {
    decltype(find_me(ConvertTo<Stuck>{})) test1;
}
Run Code Online (Sandbox Code Playgroud)

该函数find_me多次重载,从未实际实现过.我只是想知道当函数有这些形式时是否有办法找到返回类型.我知道接收指针或引用是可能的,这就是我现在正在做的事情,但我想知道是否还有一些技巧可以使它工作.

如果有,请告诉我,告诉我原因.

谢谢.

Bri*_*ian 5

这有效:

struct Stuck {
    Stuck() = delete;
    Stuck(Stuck&&) = delete;
    Stuck(const Stuck&) = delete;
    Stuck& operator=(Stuck&&) = delete;
    Stuck& operator=(const Stuck&) = delete;
};

double find_me(Stuck);
void find_me(double);

template <typename Ret>
Ret get_stuck_return_type(Ret (*)(Stuck));

int main() {
    decltype(get_stuck_return_type(find_me)) test1;
}
Run Code Online (Sandbox Code Playgroud)

Coliru链接:http://coliru.stacked-crooked.com/a/7eca81a13fae9de3

即使在find_me重载时它仍然有效的原因是模板参数推导将尝试每次重载find_me.如果推导成功只有一个重载,那么选择一个重载来实例化模板.

我认为这是一个纯粹的学术练习,因为按价值采用不可破坏类型的函数不能起到实际作用.

  • 如果任何`find_me`是模板,则不起作用.`template <class T> void find_me(double,T);`会杀死它. (2认同)