6

ヘッダー ファイルの名前空間内にクラスがあります。このクラスにはテンプレート型が必要ですが、特定の型のみを使用したいと考えています。以下に例を示します。

ファイル a.hpp

// a.hpp
namespace a_ns {
template<class T>    
class a {
    // stuff
};
typedef a<double> a_double;
} // end of namespace
// stuff

ファイル b.hpp

// b.hpp
#include <a.hpp>
namespace b_ns {
    typedef a_ns::a_double b;
}

ファイル main.cpp

// main.cpp
#include "b.hpp"
int main() {
    b_ns::b my_b; // <<<--- I LIKE this!
    a_ns::a<float> my_a_which_is_not_allowed; // <<<--- I DO NOT LIKE THIS THOUGH! D:
}

したがって、かなり長い例からわかるように、最終的な目的は、エンド ユーザーが型名としてclass awithを宣言するfloatことを許可せず、によって宣言されているように、特定の型を持つ事前定義されたクラスのみを使用できるようにすることtypedef a<double> a_double;です。

上記の例ではこれが可能だと思っていましたが、間違っていました。a<float>上記のように を作成できb.hppますa.hpp。それで、あなたは問題を見ます!(うまくいけば?)

これが可能であれば、おそらく簡単な解決策があります。

4

2 に答える 2

0

static_assert を使用する方法は次のとおりです

#include <type_traits>
template <typename T>
class X
{
  T i;
  static_assert(!std::is_same<float,T>::value,"Don't use floating point");
};



int main()
{
    X<int> a;
    //X<float> b; fails at compile time
    return 0;
}

これは、変数が const または volatile でない限り機能します。

于 2013-08-23T18:05:57.007 に答える