gpt4 book ai didi

c++ - 如何使用 result_of 代替 decltype?

转载 作者:行者123 更新时间:2023-12-03 02:48:30 28 4
gpt4 key购买 nike

this answer我创建了一个类型特征:

template<typename T>
using to_string_t = decltype(to_string(declval<T>()));

这工作得很好,但我最初打算使用result_of,但现在我不知道该怎么做,这让我很恼火。

我正在尝试将上面的行替换为如下内容:

template<typename T>
using to_string_t = result_of<to_string(T)>;

但是我收到了一个编译器错误:

error C2275: 'T': illegal use of this type as an expression
note: see declaration of 'T'
error C2974: 'std::result_of': invalid template argument for '_Fty', type expected

我已经尝试了 result_of 的其他几种输入,但没有成功,任何人都可以帮助我理解 result_of 这里需要什么参数吗?

最佳答案

让我们修补它。 std::result_of 只需要类型,其结果应该从其 type 内部 typedef 中检索,并且您需要 typename 来访问所述 typedef,因为它取决于模板参数。

template<typename T>
using to_string_t = typename std::result_of<decltype(std::to_string)(T)>::type;
^^^^^^^^ ^^^^^^^^ ^^^^^^

或者在 C++14 中,您可以删除 ::typetypename :

template<typename T>
using to_string_t = std::result_of_t<decltype(std::to_string)(T)>;
^^

还好吗?

main.cpp:5:68: error: decltype cannot resolve address of overloaded function

对,std::to_string 已重载,因此我们需要通过将其强制转换为其重载之一来消除歧义。

template<typename T>
using to_string_t = typename std::result_of<decltype(static_cast<

坚持住。我们需要它的返回类型来表达强制转换的目标类型。我们又回到了起点。

std::result_of 无法处理重载函数,因为在解决重载之前该函数没有确定的类型。 decltype 是这里唯一的解决方案,因为它确实应用重载解析。

如果您想知道 std::result_of 有何用途,考虑到上述限制:它用于重载仿函数,即重载 () 运算符的类几次。由于类的类型是已知的,并且不依赖于调用参数,因此 std::result_of 可以工作。

...但是 std::to_string 不应该总是返回 std::string ??

关于c++ - 如何使用 result_of 代替 decltype?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30595146/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com