2016-12-23 9 views
2

これを行う方法はありますか?私が知る限り、言語はそれをサポートしていないので、私は確信しています。テンプレート型パラメータへの戻り型の控除

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

これは場合によってはうれしいことです。たとえば、戻り値の型でサポートされている概念を文書化したい場合(そうでなければ、単純な自動であり、読者は情報を探して他の場所に行く必要があります)。

これがまともなものであると思われる場合、私はこれを将来の標準に提案したいと思います。戻り型の概念は既にC++ 20標準にありますか?

ありがとうございます!

+0

これはあなたが探しているものですか? http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0238r0.html –

答えて

2

あなたはちょうどあなたがhttps://isocpp.org/

で継続的な標準化の取り組みについて知りたいかもしれない何でも見つけることができます具体的には、https://isocpp.org/blog/2016/12/2016-11-post-issaquah-mailing-availableリストCの現在のドラフトにテキストと最新のメーリングリスト内のすべての文書、+ +17。

この時点で、コンセプトのではありませんでした。しかし、それは次回の会議で変わるかもしれません。

+0

申し訳ありません。私はC++ 20を意味しました。私は質問を更新します – Curious

+1

@Curious C++ 17がかなり最終的ではないことを考えると、誰かがこの時点でC++ 20に含まれるものを知っているとは思わないでしょう。 –

+0

ありがとう!私はあなたの答えをupvotedしかし、私はまだ質問の他の部分に対処する答えを待つでしょう。 – Curious

1

これを行うには、関数宣言と末尾の戻り値の型を使用できます。
最小限、実施例(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>です。

関連する問題