我希望能夠改變mixin最內層類型的類型。草圖如下所示:構造一個改變mixin基類的類型
struct PointTypeA {
double x,y;
};
struct PointTypeB {
double x,y,z;
};
template<class Base>
class MyMixin1 : public Base {
public:
double someProperty;
};
template<class Base>
class MyMixin2 : public Base {
public:
double someProperty;
};
// how do we automatically construct MyMixin2<MyMixin1<TNewInside> > from MyMixin2<MyMixin1<PointTypeA> >
// template <typename T, typename TNewInside>
// ChangedType ChangeInsideType(T object) {
// return ChangedType(object);
// }
int main() {
typedef MyMixin2<MyMixin1<PointTypeA> > Mixed12A;
Mixed12A mixed12A;
//MyMixin2<MyMixin1<PointTypeB> > mixed12B = ChangeInsideType<Mixed12AType, PointTypeB>(mixed12A);
return 0;
}
是這樣的可能嗎?
template <class ToReplace, class With>
struct replace_inner {
using type = With;
};
template <template <class> class Outer, class Inner, class With>
struct replace_inner<Outer<Inner>, With> {
using type = Outer<typename replace_inner<Inner, With>::type>;
};
template <class ToReplace, class With>
using replace_inner_t = typename replace_inner<ToReplace,With>::type;
我們使用它像這樣:
using replaced = replace_inner_t<MyMixin1<MyMixin2<PointTypeA>>, PointTypeB>;
static_assert(
std::is_same<replaced, MyMixin1<MyMixin2<PointTypeB>>>::value, "wat"
);
然後你只需要編寫點類型和混合類型之間的轉換構造
你可以使用C++ 11嗎? – TartanLlama
@TartanLlama當然。 –