C++:类型删除虚拟模板解决方法

标签 c++ templates type-erasure

我正在使用类型删除设计模式来为我的模板类之一公开一个独立于模板的接口(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); 

编辑:

这是一个更简单的工作示例,使用打印方法而不是上面的熔断方法,它显示了我希望它如何工作:

http://codepad.org/8UbJguCR

最佳答案

进行由内向外类型的删除。

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/

相关文章:

django - 模板中没有命名循环。 'row1,row2' 未定义

c++ - 如果我的相机分辨率没有改变,如何捕捉?

c++ - 确保指针未被删除

采用 STL 样式迭代器的 C++ 虚方法

scala - 为什么重载具有不同上限的多态方法不能在 Scala 中编译

java - 未经检查的分配警告

java - 类型删除是在 Java 编译器进行类型检查之前完成的吗?

c++ - 无法使用opencv cuda调用

c++ - 在 C++ 中使用多个流写入单个输出文件

C++:为什么这个 constexpr 不是编译时常量