C ++:使用模板中的两个相同类型名构造海峡

C++: Construct strait with two same typenames from template

我是 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

,这会 return 错误。 显然我不允许在模板中两次定义相同的类型名(模板),但我不确定我应该怎么做。如果我删除其中之一,参数的数量将不再匹配。

我该如何进行?

提前致谢!

  1. Measure_same 需要使用两个不同的模板参数。如果类型相同,value 的 return 值将始终为 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()
    

    例如:

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

您可以使用模板专业化和来自 type_traits

的一些帮助

基本模板(始终为 false):

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

具有相同 Unit 参数的两个 Measures 类 的特化:

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

像这样使用它:

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