我正在使用类型删除设计模式来为我的模板类之一公开一个独立于模板的接口(interface)。但是,我遇到了一个问题,我希望公开的方法之一(将两个模板化实例融合到具有不同模板常量参数参数的第三个实例)似乎需要模板虚拟方法,这是非法的。
这是我的代码:
#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;
}
是否有人有另一种不需要虚拟模板成员的方法来实现此目的?
编辑:这个“模板独立接口(interface)”的目的是将具有不同模板参数的条实例 vector 传递给函数:
std::vector< bar_any_N > vec;
vec.push_back(bar<2>());
vec.push_back(bar<5>());
foo_func(vec);
编辑:
这是一个更简单的工作示例,使用打印方法而不是上面的熔断方法,它显示了我希望它如何工作:
最佳答案
进行由内向外类型的删除。
struct bar_raw
{
std::size_t N;
explicit bar_raw( std::size_t n ):N(n) {}
bar_raw fuse( const bar_raw& rhs ) { return bar_raw(N+rhs.N); }
};
template<size_t N>
struct bar: bar_raw
{
bar():bar_raw(N) {}
template<size_t M>
bar<M+N> fuse(const bar<M>& rhs) { return bar<M+N>(); }
};
将所有状态保留在 bar_raw
中。有一个漂亮的界面,有助于在 bar<N>
中编写代码,就像n元索引一样。
当通过bar<N>
时要输入删除,请忽略 bar<N>
组件和类型删除 bar_raw
,这是非常微不足道的。
您可以调用bar_raw
你的bar_any
如果你愿意,或者你可以离开bar_raw
作为实现细节,并将其包装在 bar_any
中这一切都很漂亮。
关于C++:类型删除虚拟模板解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19774700/