2017-03-21 11 views
0

から2つの同じ型名私はC++にかなり新しいだと私はこのような何かを構築するために全力をしようとしていると海峡構築:C++:テンプレート

enum class Unit { km, m, cm }; 


template<int v, Unit u> 
struct Measure { 
    static const int value = v; 
    static const Unit unit = u; 
}; 


template<typename Measure, typename Measure> 
struct Measures_same { 
    static const bool value(const Measure m1, const Measure m2) { 
     return m1.unit == m2.unit; 
    } 
}; 

ここでの私の目標は、私は私の形質を呼び出すことができるということです次のようになります。

Measures_same<Measure<1, Unit::km>,Measure<1, Unit::cm>>::value 

falseを返します。 明らかに、私はテンプレートで同じtypenameを2回(テンプレート)定義することは許されていませんが、他にどのようにすればいいのかは分かりません。私がそれらの1つを削除すると、引数の量はそれ以上一致しません。

どうすればよいですか?

ありがとうございます!

+2

template<int v, Unit u, int w> struct Measures_same<Measure<v, u>, Measure<w, u>> : std::true_type{}; 

はそうのようにそれを使用しますM2? 'constexpr'を使って静的関数を使わなくてもこれを行うことができます。さらに、 'const bool'を返すのは意味をなさないので、' bool'を返すこともできます。 – cdhowie

+0

どのように私の愚かな、多くのありがとう! – user1390504

+0

オブジェクト指向プログラミングとテンプレートメタプログラミングを混在させているようです。おそらく実行時に値を変更したいと思うので、おそらく 'Measure'はテンプレートではありません。おそらく、それはユニットの次元(長さ、質量、電荷など)に基づくテンプレートである可能性があります。 'Measures_same'オブジェクトの使い方を知るために質問を編集して完全なプログラム([mcve])を作成すると、ニーズに合わせて何を変更する必要があるかが明確になります。 –

答えて

1
  1. Measure_sameは、2つの異なるテンプレートパラメータを使用する必要があります。型が同じ場合は、戻り値valueは常にtrueになります。用途:

    template<typename Measure1, typename Measure2> 
    struct Measures_same { ... }; 
    
  2. あなたはMeasure_same::valueに任意の入力を必要としません。単純に使用します。

    template<typename Measure1, typename Measure2> 
    struct Measures_same { 
        static const bool value() { 
         return Measure1::unit == Measure2::unit; 
        } 
    }; 
    
  3. Measure_sameからvalueを取得するには、関数呼び出しを使用してください。用途:たとえば

    Measures_same<Measure<1, Unit::km>,Measure<1, Unit::cm>>::value() 
    

    template<class...> 
    struct Measures_same : std::false_type{}; 
    

    :あなたはテンプレートの特殊化とtype_traits

    ベースのテンプレート(常にfalse)からいくつかの助けを使用することができます

    std::cout << std::boolalpha << Measures_same<Measure<1, Unit::km>,Measure<1, Unit::cm>>::value() << std::endl; 
    
+1

'value'は値です:' static const bool value = Measure1 :: unit == Measure2 :: unit; '。 –

+0

@TobySpeight、これもオプションです。私はそれが機能であるというOPの考えにとどまった。 –

1

2つのスペシャライゼーション同じUnit引数を持つMeasuresクラス:ちょうど `テンプレート `を行うと `M1`とを`使用

static_assert(Measures_same<Measure<1, Unit::km>, Measure<2, Unit::km>>::value, "Fail"); 
static_assert(!Measures_same<Measure<1, Unit::m>, Measure<1, Unit::km>>::value, "Fail2"); 

Demo