c++ - 有没有办法 decltype 不可调用函数的结果?

标签 c++ c++11 decltype

我想知道是否有人有同样的技巧来找到 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;
}

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

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

int main() {
    decltype(find_me(ConvertTo<Stuck>{})) test1;
}

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);
void find_me(double);

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

int main() {
    decltype(get_stuck_return_type(find_me)) test1;
}

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

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

我认为这纯粹是学术练习,因为按值采用不可构造类型的函数可能没有任何实际用途。

关于c++ - 有没有办法 decltype 不可调用函数的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44508675/

相关文章:

c++ - 使用函数参数作为常量表达式的一部分 - gcc vs clang

c++ - 在类似于 Scott Meyer 的单例惯用语的实现中使用新线程安全来实例化单例吗?

c++ - 类方法声明中的 decltype : error when used before "referenced" member is declared

c++ - GCC7 在同一个类中推断出存在 const 修饰符

c++ - 调试打印解压缩可变参数模板函数参数

c++ - NOT 对整数值的操作

c++ - 在 std::move() 之后删除堆上的结构成员

android - 使用 Qt for Android 在 Android 中显示网页

c++ - 如何将视频级别分配给ffmpeg中的结构AVCodecContext?

c++ - 在 CRTP 基类的后期指定返回中使用 decltype