2

次のジレンマの代替案を探しています。デフォルトのテンプレート引数を持つテンプレート クラス/関数があり、空の場合でも山かっこを適用する必要がある場合の方法を知っていますか? これは私の修正の試みです。単純なtypedef( typedef X<> L) を使用できることはわかっていますが、クラスを参照するために別の名前を使用したくありません。

そこで、次のことを試しました。しかし、何らかの理由で、テンプレート引数に型を指定しても機能しません。何故ですか?

#include <type_traits>

template <typename = void> struct X {};

template <typename T = void>
using L = typename std::conditional<
              std::is_void<T>::value,
              X<>,
              X<T>
>::type;

int main()
{
    L l;
}

エラー:

prog.cpp: 関数 'int main()' 内:
prog.cpp:10:7: エラー: 'l' の前にテンプレート引数がありません<br> prog.cpp:10:7: エラー: 予期される ';' 'l' の前<br>

4

1 に答える 1

4

構文は他のタイプ テンプレートと同じです。デフォルト テンプレートの場合でも、空のテンプレート ブラケットを指定する必要があります。

L<> l;

内部は何もしないので、using宣言は実際には冗長conditionalです - あなたはそれを削除することができますtemplate <typename T = void> using L = X<T>;- 明らかにあなたが望むものではありません.

これが問題です。これを回避する方法はありません。型テンプレートは型とは異なり (正当な理由もあります!)、後者を前者として扱うことはできません。型を取得するには、テンプレートをインスタンス化する必要があります。

于 2013-05-09T20:45:18.457 に答える