我有两个接口要与 CRTP 一起用于静态多态性。其中一个包含一个函数,其签名中的类型取决于实现。
这个问题看起来像这里没有解决方案的问题。我想出的解决方案包括定义类型的附加模板结构。然后,此模板专门用于避免“不完整类型的无效使用”错误的实现。
这是我的代码
#include <iostream>
#include <memory>
template<class impl1>
struct Interface1 {
double foo() { return static_cast<impl1*>(this)->fooimpl();}
};
template<class impl1, class impl2>
struct typeHelp;
template<class impl1, class impl2>
struct Interface2 {
void bar(typename typeHelp<impl1,impl2>::type value) {
static_cast<impl2*>(this)->barimpl(value);
}
};
//Implementation2 pre declaration
template<class impl1>
struct Implementation2;
//Partial specialization of templated typeHelp
template<class impl1>
struct typeHelp<impl1, Implementation2<impl1>> {
using type = int;
};
//Implementation2
template<class impl1>
struct Implementation2 : public Interface2<impl1, Implementation2<impl1>> {
std::shared_ptr<Interface1<impl1>> imp1;
void barimpl(typename typeHelp<impl1,Implementation2>::type value) {
std::cout << imp1->foo() << " " << value << std::endl;
}
};
//Implementation1
struct Implementation1 : public Interface1<Implementation1> {
double fooimpl() {return 0.;}
};
int main()
{
Implementation2<Implementation1> obj;
obj.imp1 = std::make_shared<Implementation1>();
obj.bar(4);
}
我在这段代码中不喜欢的是 Interface2 和 typeHelp 依赖于模板参数 impl1。这适用于我的特殊情况,其中 Implementation2 是相对于 impl1 进行模板化的,但如果 Implementation2 不是,则不会。我想知道这个问题是否有更通用和更优雅的解决方案。