我想知道是否有人有相同的技巧来查找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
多次重载,从未实际执行过。我只是想知道当函数有这些形式时是否有办法找到返回类型。我知道接收指针或引用是可能的,这就是我已经在做的事情,但我想知道是否还有一些技巧可以使它工作。
如果有,请告诉我,并告诉我原因。
感谢。
答案 0 :(得分: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;
}
Coliru链接:http://coliru.stacked-crooked.com/a/7eca81a13fae9de3
即使重载find_me
,这种方法也起作用的原因是模板参数推导将尝试find_me
的每次重载。如果扣除成功只有一个重载,那么选择一个重载来实例化模板。
我认为这是一个纯粹的学术练习,因为按价值采用不可构造类型的函数不能用于实际目的。
答案 1 :(得分:0)
std::declval可以解决问题:
stringr::str_extract
答案 2 :(得分:0)
如何让用户添加模板专精?
您的代码:
template <typename T>
struct find_me
{
struct please_add_your_own_find_me {};
using type = please_add_your_own_find_me;
};
客户代码:
template <>
struct find_me<Stuck>
{
using type = double;
};
然后:
find_me<Stuck>::value test1;