[英]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.