我有一个这样的结构体:
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>>;
};
演示