【问题标题】:Return type deduction into a template parameter返回类型推导到模板参数中
【发布时间】:2016-12-23 21:40:37
【问题描述】:

有没有办法做到这一点?据我所知没有,因为该语言不支持它,但我想确认一下

template <typename Something>
ConceptCheck<auto> return_something(const Something& something) {
    return process_something(something);
}

这在某些情况下会很好。例如,想要记录返回类型所支持的概念(否则将是简单的自动,需要读者到其他地方寻找信息)。

如果这似乎是一个不错的提议,我想将此提议为未来的标准,有人可以指导我如何做到这一点吗?返回类型的概念是否已经在 C++20 标准中?

谢谢!

【问题讨论】:

标签: c++ c++14 c++-concepts return-type-deduction


【解决方案1】:

您可以在https://isocpp.org/找到有关正在进行的标准化工作的任何信息

具体来说,https://isocpp.org/blog/2016/12/2016-11-post-issaquah-mailing-available 列出了最新邮件中的所有文档,以及当前 C++17 草案的文本。

我可以告诉您,Concepts 目前被纳入标准草案。不过,这可能会在下次会议上改变。

【讨论】:

  • @Curious 我认为目前没有人知道 C++20 将包含什么,因为 C++17 还不是最终版本。
  • 谢谢!我赞成您的回答,但我仍会等待解决问题其他部分的答案。
【解决方案2】:

您可以使用函数声明和尾随返回类型来做到这一点。
它遵循一个最小的工作示例 (C++14):

#include<type_traits>

template<typename>
struct ConceptCheck {};

template<typename T>
T get_it(ConceptCheck<T>);

ConceptCheck<char> process_something(int) { return {}; }
ConceptCheck<void> process_something(double) { return {}; }

template <typename Something>
auto return_something(const Something& something)
-> ConceptCheck<decltype(get_it(process_something(something)))> {
    return process_something(something);
}

int main() {
    static_assert(std::is_same<decltype(return_something(0)), ConceptCheck<char>>::value, "!");
    static_assert(std::is_same<decltype(return_something(0.)), ConceptCheck<void>>::value, "!");
}

好吧,我承认ConceptCheck&lt;auto&gt; 会比:

ConceptCheck<decltype(get_it(process_something(something)))>

无论如何,如果目标是记录返回类型ConceptCheck,无论实际模板参数是什么,这是一个可行的解决方案。

如果您不喜欢尾随返回类型,或者由于您的文档工具不支持它而无法记录它,您仍然可以使用std::declval,如下所示:

template <typename Something>
ConceptCheck<decltype(get_it(process_something(std::declval<Something>())))>
return_something(const Something& something) {
    return process_something(something);
}

甚至更好:

template <typename Something, typename T = decltype(get_it(process_something(std::declval<Something>())))>
ConceptCheck<T>
return_something(const Something& something) {
    return process_something(something);
}

额外的模板参数很丑,但返回类型最终是ConceptCheck&lt;T&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多