0

どちらがより正しいですか? なぜ。

仕事で、私は最近、特定のテンプレートの専門化を行う方法についての議論に参加しました。

こちらです:

template <typename T, bool someBoolVar = is_polymorphic<T>::value>
struct SomeTemplate { // with empty definition
};

template <typename T>
struct SomeTemplate<T, true> {
  ...
};

template <typename T>
struct SomeTemplate<T, false> {
  ...
};

またはこの方法:

template <typename T, bool someBoolVar = is_polymorphic<T>::value>
struct SomeTemplate; // without empty definition           -- difference here

template <typename T>
struct SomeTemplate<T, true> {
  ...
};

template <typename T>
struct SomeTemplate<T, false> {
  ...
};
4

3 に答える 3

2

ない。どちらもコンパイルされないためです。部分的な特殊化の構文が間違っています!

部分的な特殊化は次のように行われます。

//correct syntax
template <typename T>
struct SomeTemplate<T,false> {
  ...
};

これではない:

//wrong syntax
template <typename T, false>
struct SomeTemplate {
  ...
};

構文を修正すると仮定して、質問に答えてください。

私の意見では、2 番目のアプローチは合理的です。2 つのboolしか持てないため、最初のアプローチで行っている3 つのバージョンのクラス テンプレートはまったく意味がありません。SomeTemplate

于 2011-01-19T15:20:29.013 に答える
0

2 番目の方法では、特殊化されていない方法でテンプレートを使用しようとすると、コンパイラ エラーが生成されます。最初の方法は、そのような場合に空のクラスを提供するだけであり、後でクラスを使用しようとしたときにエラーが発生する場合と発生しない場合があります。

ここでのキッカーは、 には 2 つの値しかなくbool、両方に特化しているため、どちらに進むかは実際には問題ではないということです。空のクラスはリンクされないため、余分なコードは生成されません。

この特定のケースは、コンパイル時のアサーション パターンに似ています。

template<bool test> struct compiler_assert;
template<> struct compiler_assert<true> {};

// ...

compiler_assert<bool_test_goes_here> assert1;

テストが に評価された場合、コンパイルを停止しますfalse

于 2011-01-19T15:19:14.387 に答える
0

どちらの例にも構文エラーがあります。それらを修正すると仮定すると、2つの間に違いはありません。最初の例で提供した空の実装は使用できないため、コードは生成されません。

于 2011-01-19T15:24:33.940 に答える