将类型扣除返回到模板参数中

时间:2016-12-23 21:40:38

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

有没有办法可以做到这一点?据我所知,由于语言不支持,但我想确认

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

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

如果这似乎是一个体面的建议,我想提出这个未来的标准,有人可以指导我如何这样做吗?返回类型概念是否已经在C ++ 20标准中了?

谢谢!

2 个答案:

答案 0 :(得分:2)

您可以在https://isocpp.org/

找到有关正在进行的标准化工作的任何内容。

具体来说,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>