2017-12-28 15 views
2

私はこの機能を理解していないここにhttps://github.com/abseil/abseil-cpp/blob/master/absl/types/span.h#L673懸垂下降C++テンプレート引数

template <int&... ExplicitArgumentBarrier, typename T> 
constexpr Span<T> MakeSpan(T* ptr, size_t size) noexcept { 
    return Span<T>(ptr, size); 
} 

を探しています。 int&... ExplicitArgumentBarrierは何をしているのですか? この関数では使用されていないので、なぜ使用されているのかわかりません。

これは、それが使用されている理由を何トリック」が表示する例をいただければ幸いです。あなたが悪いのコードで見つけ

+0

検索バリデーションテンプレート。ここに出発点があります:http://www.stroustrup.com/C++11FAQ.html#variadic-templates –

+0

私は 'variadic templates'を知っています - ' ExplicitArgumentBarrier'が関数で使われていません。私はなぜその使用されているか知りたい。 – PYA

+2

これは、人々が明示的なテンプレート引数を入れないため、テンプレート引数の控除を無効にするためです。 –

答えて

8

一般的なパターンは、例えば、それ以外の場合はテンプレート引数控除を実行することになり、関数テンプレート内の明示的なテンプレート引数の使い方です

これは余分であり、この場合、2番目の引数の明示的な型は、推測された型とはまったく異なります。そうすることから人々を防ぐために

誰も明示的にこれらの引数に名前を付けることができないように、あなただけの、推測される引数の前に可変長引数偽のテンプレート引数を置くことができます。

開発者が明らかに偽の引数の型としてint&...を選んだが、それは他のもの(だけでなく、別のタイプ)だったかもしれないし、意味をなすべきか、彼らはまた、それに名前を与えたコードの可読性、ExplicitArgumentBarrierを改善するために、今。コメントで

1

は、あなたが私はかなり理解しない、

を尋ねた - どのように、あなたによると、MakeSpan呼ばれるべき?

ここにはMakeSpanを使用しないデモンストレーションプログラムがあります。すべて明示的に指定されたテンプレートパラメータは無視され

int a; 
int b; 
auto s1 = MakeSpan(20);  // T is deduced to be int 
auto s1 = MakeSpan<a, b>(20); // T is still deduced to be int 

MakeSpanを伴う

template <typename ... T, typename T2> void foo(T2 arg) {} 

template <int ... N, typename T2> void bar(T2 arg) {} 

int main() 
{ 
    foo<int, int>(0); // T2 is deduced to be int 
    foo(0);    // T2 is still deduced to be int 
    foo<int, int>(10.5); // T2 is deduced to be double 
    foo(10.5);   // T2 is still deduced to be double 


    bar<10, 20, 30>(1); // T2 is deduced to be int 
    bar(1);    // T2 is still deduced to be int 

    bar<10, 20, 30>(1.2); // T2 is deduced to be double 
    bar(1.2);    // T2 is still deduced to be double 
} 

関数呼び出しは次のようになります。引数の型は常に導出されます。

+0

素晴らしい - ありがとう、これは本当に私のために物事をクリア:) – PYA

関連する問題