繁体   English   中英

将类型推导返回到模板参数中

[英]Return type deduction into a template parameter

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

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

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

如果这似乎是一件值得推荐的事情,我想将其作为将来的标准提出,有人可以指导我如何做吗? 返回类型概念已经在C ++ 20标准中吗?

谢谢!

您可以在https://isocpp.org/上找到有关正在进行的标准化工作的几乎所有信息。

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

我可以告诉你,目前概念草案尚未被接受。 不过,下一次会议可能会改变。

您可以使用函数声明和尾随返回类型来执行此操作。
它遵循一个最小的有效示例(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<auto>会比以下更好:

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<T>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM