4

この単純なクラスを考えてみましょう:

template<class T>
class Foo{
public:
  Foo(T const& val)
    : _val(val) {}

  template<class U>
  Foo(Foo<U> const&){
    static_assert(false,"Cannot convert from Foo<U> to Foo<T>.");
  }

  operator T&() { return _val; }
  operator T const&() const{ return _val; }

private:
  T _val;
};

テンプレート型からの暗黙的な構築と、単純なラッパーであるその型への暗黙的な変換を許可します。

今、関係のない s 間の変換を有効にしたくありませんFoo。これは、これらの暗黙的な構築/変換のために可能になります。テンプレート化された copy-ctor を非公開にすることはできますが、static_assert.

問題は、ここで Ideoneに示されているようstatic_assertに、タイプをコピーしようとしても失敗することです! Visual Studio では、必要な動作が得られますが、これは VS がテンプレートを解析する方法によるものだと思います。これを機能させる方法はありますか?

4

2 に答える 2

7

static_assertコンパイラは、何があっても失敗することを明確に認識できるため、コンパイルに失敗します。それは依存せず、決して依存しませUT

私はあなたがこのようなものが欲しかったと思います:

static_assert(std::is_same<T,U>::value,"Cannot convert from Foo<U> to Foo<T>.");
于 2011-06-19T07:07:51.210 に答える
2

std::is_convertible が解決策のようです。

http://en.cppreference.com/w/cpp/types/is_convertibleから:

「タイプ From の虚数の右辺値が、To を返す関数の return ステートメントで使用できる場合、つまり、暗黙的な変換を使用して To に変換できる場合は、true に等しいメンバー定数値を提供します。それ以外の場合、値は false です。」

于 2012-08-30T12:53:38.687 に答える