概念上的嵌套模板结构



我有一个这样的结构体:

struct i32 {
template<int32_t x>
struct val {
static constexpr int32_t v = x;
};
template<typename v1, typename v2>
struct add {
using type = val<v1::v + v2::v>;
};
template<typename v1, typename v2>
using add_t = typename add<v1, v2>::type;
};

显然,我在那个结构体中有更多的方法和嵌套类型。我还有其他类似的结构体,如i64等,我将其命名为"Rings"

在后面的代码中,我有一个模板结构体
template<typename Ring>
struct FractionField {
// many things here
};

我想有一个c++的概念为我的环类型,所以我可以检查在编译类型,用户定义的"环"具有适当的嵌套类型和操作。

我的尝试是这样的:


template<typename T>
concept RingConcept = requires {
typename T::val; // how to express that val must be a template on a numeric value ?? 
typename T::template add_t<typename T::val, typename T::val>; // same here ??
};

然而,我所有的尝试都没有定论。

基本上,我总是得到这种错误,不知道如何修复它们:

error: constraints not satisfied for alias template 'FractionField' [with Ring = i32]
using Q32 = FractionField<i32>;
note: because 'typename T::template add_t<typename T::val, typename T::val>' would be invalid: typename specifier refers to class template member in 'i32'; argument deduction not allowed here
typename T::template add_t<typename T::val, typename T::val>;

我希望我不需要为嵌套模板val使用的每个数字类型写一个概念。

requires-子句中的typename后跟类型而不是模板。由于T::val是一个接受数字值的类模板,因此用0实例化T::val应该就足够了

template<typename T, typename val = typename T::template val<0>>
concept RingConcept = requires {
typename T::template add_t<val, val>;
};

template<typename T>
concept RingConcept = requires {
typename T::template val<0>;
typename T::template add_t<typename T::template val<0>, 
typename T::template val<0>>;
};

演示

最新更新