从派生类初始化const融合增强列表

Initialise const fusion boost list from derived class

本文关键字:融合 增强 列表 const 初始化 派生      更新时间:2023-10-16

是否有可能将成员融合向量初始化为派生类中指定的值,而不使基类成为模板类?

:

class container
{
const auto children;
container (auto children):children (children){}
}
class derived : public container
{
derived():container(make_vector(string("test1"),string("test"))){} // http://www.boost.org/doc/libs/1_57_0/libs/fusion/doc/html/fusion/container/generation/functions/make_vector.html
}

我知道这行不通——但我希望它能让你更容易理解我的目标。

  1. 延迟指定vector将包含的类型,直到从它派生出一个类。
  2. 通过使基类成为模板类而不指定vector应该包含的类型

如果不是-最接近它的是什么?

不要求基类必须是模板的最接近的方法是使用类型擦除。您可以滚动自己的¹或使用Boost类型擦除等。选择最适合你的。

实现它的最简单方法是boost::any:

示例

Live On Coliru

#include <boost/any.hpp>
#include <boost/fusion/include/io.hpp>
#include <boost/fusion/include/vector.hpp>
#include <boost/fusion/include/make_vector.hpp>
#include <string>
namespace fus = boost::fusion;
class container
{
  protected:
    boost::any children;
    template <typename T>
    container (T const& children) : children(children) {}
};
class derived : public container
{
    using V = boost::fusion::vector2<std::string, std::string>;
  public:
    derived() : 
        container(fus::make_vector(std::string("test1"),std::string("test"))){} 
    friend std::ostream& operator<<(std::ostream& os, derived const& d) {
        return os << boost::any_cast<V const&>(d.children);
    }
};
#include <iostream>
int main() {
    derived d;
    std::cout << d;
}

打印

(test1 test)

¹例

    c++中面向对象与泛型编程的矛盾
  • 生成没有虚函数的接口?
  • boost::multi_array的容器类型