【发布时间】:2018-06-14 20:15:06
【问题描述】:
我正在尝试用 C++ 编写与一组类型类类似的东西,但我正在努力解决如何安排模板签名,或者是否可以做我想做的事情。
把它分解成最小的例子,假设我有这个:
template<typename S, typename T>
struct Homomorphism {
//Defined in specialization: static const T morph(const S&);
static constexpr bool is_instance = false;
using src = S;
using dest = T;
};
template<typename S, typename T>
struct Monomorphism : Homomorphism<S, T> {
//Defined in specialization: static const T morph(const &S);
static constexpr bool is_instance = false;
using src = S;
using dest = T;
};
我的程序中的数据类型有这些类(和其他态射)的特化。
我现在想做的是编写一个结构模板,它将采用两个同态或两个单态并将它们组合起来分别生成一个新的同态或单态结构,即:
template<typename S, typename T, typename U,
typename HST = Homomorphism<S, T>,
typename HTU = Homomorphism<T, U>,
typename HSU = Homomorphism<S, U> >
struct CompositionMorphism : HSU {
static const U morph(const S &s) {
return HTU::morph(HST::morph(s));
}
static constexpr bool is_instance = true;
using src = S;
using dest = U;
}
这实际上适用于通过以下方式组合同态的特殊实例:
CompositionMorphism<Class1, Class2, Class3>::morph(class1Instance);
当我有:
struct Homomorphism<Class1, Class2> {
static const Class2 morph(const Class1 &c) {
...
}
};
和Homomorphism<Class2, Class3>类似。
不过,现在我想写:
template<typename S, typename T, typename U,
typename MST = Monomorphism<S, T>,
typename MTU = Monomorphism<T, U>,
typename MSU = Monomorphism<S, U> >
struct CompositionMorphism : MSU {
static const U morph(const S &s) {
return MTU::morph(MST::morph(s));
}
static constexpr bool is_instance = true;
using src = S;
using dest = U;
};
但毫无疑问,编译器会抱怨 CompositionMorphism 的重复定义。
有没有办法用Homomorphism 和Monomorphism 编写CompositionMorphism 及其专业化,这样我就可以做电话之类的事情:
template<> struct Homomorphism<Class1, Class2> { ... };
template<> struct Homomorphism<Class2, Class3> { ... };
CompositionMorphism<Class1, Class2, Class3>::morph(c1Instance);
或:
template<> struct Monomorphism<Class1, Class2> { ... };
template<> struct Monomorphism<Class2, Class3> { ... };
CompositionMorphism<Class1, Class2, Class3>::morph(c1Instance);
或:
template<> struct Monomorphism<Class1, Class2> { ... };
template<> struct Homomorphism<Class2, Class3> { ... };
CompositionMorphism<Class1, Class2, Class3>::morph(c1Instance);
并让编译器根据我的态射层次选择最接近的CompositionMorphism 特化?
【问题讨论】:
-
CompositionMorphism(Class1, Class2, Classe)— 你的意思是Class3和尖括号吗? -
我实际上并没有得到,什么时候应该选择任何一个类。 (在什么条件下)
-
CompositionMorphism如何知道它应该使用Homomorphism还是Monomorphism?您需要消除歧义,然后一切都很好。由于CompositionMorphism可以同时创建Homo和Mono的新版本,因此您不能依赖以前的显式实例化来进行此选择。 -
@yeputons 是的,没错。感谢您指出。我会解决的。
-
@super 我最终想要实现的技巧是能够对特殊情况进行特化(即产生比普通同态更特殊的态射形式的态射组合,例如结合两个单态),并让它们默认为组成同态的“基本”模板,如果它们不符合特殊组合之一。
标签: c++ templates metaprogramming typeclass template-meta-programming