作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想知道是否有人有同样的技巧来找到 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/
我是一名优秀的程序员,十分优秀!