您可以使用函数声明和尾随返回类型来做到这一点。
它遵循一个最小的工作示例 (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>。