これを行うには、関数宣言と末尾の戻り値の型を使用できます。
最小限、実施例(C++ 14)、次のとおりです。目標は文書化した場合には、とにかく
ConceptCheck<decltype(get_it(process_something(something)))>
:まあ、私はConceptCheck<auto>
がより立派であろうと認め
#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
は、実際のテンプレートパラメータが何であっても実行可能な解決策です。
あなたは末尾の戻り値の型を好きではないか、それはあなたの文書化ツールによってサポートされていないためにあなたがそれを文書化することができない場合は、次のように、あなたはまだ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 –