有没有办法可以做到这一点?据我所知,由于语言不支持,但我想确认
template <typename Something>
ConceptCheck<auto> return_something(const Something& something) {
return process_something(something);
}
在某些情况下,这会很好。例如,一个人想要记录返回类型支持的概念(否则这将是一个简单的自动,需要读者去其他地方寻找信息)。
如果这似乎是一个体面的建议,我想提出这个未来的标准,有人可以指导我如何这样做吗?返回类型概念是否已经在C ++ 20标准中了?
谢谢!
答案 0 :(得分:2)
具体来说,https://isocpp.org/blog/2016/12/2016-11-post-issaquah-mailing-available列出了最新邮件中的所有文档,其中包含当前C ++草案17的文本。
我可以告诉你,此时概念已经不被接受进入标准草案。不过,这可能会在下次会议上发生变化。
答案 1 :(得分:1)
您可以使用函数声明和尾随返回类型来执行此操作 它遵循一个最小的工作示例(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>
。