C++ 是否有方法取消键入不可调用函数的结果?

C++ 是否有方法取消键入不可调用函数的结果?,c++,c++11,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&) =

我想知道是否有人有同样的技巧来查找
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;
}
模板
结构转换{
算子T();
}
int main(){
decltype(find_me(ConvertTo{}))test1;
}
函数
find_me
多次重载,从未实际实现过。我只是想知道,当函数有这些形式时,是否有办法找到返回类型。我知道可能会收到一个指针或引用,这是我已经在做的事情,但我想知道是否还有一些技巧可以让它工作

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

谢谢

有个诀窍:

decltype(find_me(std::declval<Stuck>())) test1;
decltype(find_me(std::declval())test1;
这项工作:

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;
}
struct卡滞{
stacked()=删除;
卡住(卡住&&)=删除;
卡住(常数卡住&)=删除;
卡住&运算符=(卡住&&)=删除;
卡住&运算符=(常数卡住&)=删除;
};
双重查找(卡住);
无效查找我(双倍);
模板
Ret get_stack_return_type(Ret(*)(stack));
int main(){
decltype(get_stack_return_type(find_me))test1;
}
科里鲁链接:

即使在
find\u me
重载的情况下,这种方法仍然有效的原因是模板参数推断将尝试每次重载
find\u me
。如果仅通过一个重载成功演绎,则选择该重载来实例化模板


我假设这是一个纯粹的学术练习,因为一个函数采用不可构造的值类型可能没有实际用途。

让用户添加模板专业化怎么样

您的代码:

template <typename T>
struct find_me
{
    struct please_add_your_own_find_me {};
    using type = please_add_your_own_find_me;
};
模板
结构找我
{
结构,请添加你自己的,找到我{};
使用type=请添加您自己的查找我;
};
客户端代码:

template <>
struct find_me<Stuck>
{
    using type = double;
};
模板
结构找我
{
使用类型=双;
};
然后:

find_me::value test1;

使用已删除的函数“卡住::卡住(卡住&)”
如果它过载,请不要@T.C.谢谢。那么我将继续使用引用。无论是通过值还是通过引用,这个
find_me
函数可能有什么用途?@Brian我只使用它来获取返回类型。该函数实际上从未实现。@Kobi这是C++17“保证省略”,再加上
stack
是一个聚合。是的,该函数将有一个用途。我用它把某种类型映射到另一种类型。该功能从未实现过。我在元编程环境中使用它。如果任何
find\u me
是模板,它就不起作用<代码>模板无效查找(双精度,T)会杀死它。@T.C.我同意,我认为这个问题没有一个通用的解决方案。OP真的应该重新考虑他的设计目标。@Brian实际上,我将继续使用常量引用作为参数。我只是好奇:)@GuillaumeRacicot一个指针也可以<代码>(T*)0非常容易键入
find_me<Stuck>::value test1;