我使用类型擦除设计模式为我的模板类之一公开模板无关的接口。然而,我遇到了这样一个问题,即我希望公开的方法之一,它将两个模板化实例融合到具有不同模板常量参数参数的第三个实例中,似乎需要模板虚拟方法,这是非法的。C++:类型擦除虚拟模板解决方法
这是我的代码:
#include <stdlib.h>
template<size_t N>
class bar
{
template<size_t M>
bar<M+N> fuse(const bar<M>& rhs) { return bar<M+N>(); }
};
class bar_any_N
{
private:
class abstract_base
{
virtual bar_any_N fuse(const abstract_base* rhs) = 0;
template<size_t M>
virtual bar_any_N fuse_accept(const bar<M>& lhs) = 0;
};
template<size_t N>
class wrapper : public abstract_base
{
private:
bar<N> m_bar;
public:
wrapper(const bar<N>& the_bar) : m_bar(the_bar) { }
bar_any_N fuse(const abstract_base* rhs) { return rhs->fuse_accept(*this); }
template<size_t M>
bar_any_N fuse_accept(const bar<M>& lhs) { return lhs.m_bar.fuse(this->m_bar) }
};
abstract_base* m_ptr;
public:
template<size_t N>
bar_any_N(const bar<N>& the_bar) { m_ptr = new wrapper<N>(the_bar); }
};
int main()
{
bar<1> b1;
bar<2> b2;
bar_any_N b1_erased(b1);
bar_any_N b2_erased(b2);
bar_any_N b3 = b1_erased.fuse(b2_erased);
return 0;
}
没有人有另一种方式来实现这一点,就不需要虚拟模板成员?
编辑:这个“模板独立接口”的目的是为了与不同的模板的参数栏中实例的矢量传递给功能:
std::vector<bar_any_N> vec;
vec.push_back(bar<2>());
vec.push_back(bar<5>());
foo_func(vec);
编辑:
下面是一个更简单的工作示例印刷方法,而不是上面的导火索方法表明我是多么想这个工作:
'fuse_accept'是否是问题?如果是这样,你为什么不在'abstract_base'中非虚拟地实现它? – LumpN
abstract_base没有(也不能,因为它会强制它被模板化)具有成员m_bar,因此该方法需要是虚拟的才能访问此成员。 –
你究竟是什么意思'模板独立接口' –