您可以使用函數聲明和尾隨返回類型來做到這一點。
它遵循最小,工作示例(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>
。
這是你在找什麼? http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0238r0.html –