从派生 class 初始化常量融合增强列表
Initialise const fusion boost list from derived class
是否可以将成员融合向量初始化为派生 class 中指定的值,而无需将基础 class 设为模板 class?
像这样:
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
}
我知道这行不通 - 但我希望它能让我更容易理解我的目标。
- 延迟向量将包含的类型的规范,直到 class 从它派生。
- 通过将基础 class 设为模板来指定向量应包含的类型 class
如果不是-最接近它的是什么?
不需要基 class 作为模板的最接近的方法是使用类型擦除。您可以自己滚动 ¹ 或使用 Boost Type Erasure 等。选择最适合您的。
实现它的最简单方法是 boost::any
:
样本
#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)
¹ 例如
- On the Tension Between Object-Oriented and Generic Programming in C++
- Generating an interface without virtual functions?
- Container for boost::multi_array of same type but with different dimentionality
是否可以将成员融合向量初始化为派生 class 中指定的值,而无需将基础 class 设为模板 class?
像这样:
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
}
我知道这行不通 - 但我希望它能让我更容易理解我的目标。
- 延迟向量将包含的类型的规范,直到 class 从它派生。
- 通过将基础 class 设为模板来指定向量应包含的类型 class
如果不是-最接近它的是什么?
不需要基 class 作为模板的最接近的方法是使用类型擦除。您可以自己滚动 ¹ 或使用 Boost Type Erasure 等。选择最适合您的。
实现它的最简单方法是 boost::any
:
样本
#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)
¹ 例如
- On the Tension Between Object-Oriented and Generic Programming in C++
- Generating an interface without virtual functions?
- Container for boost::multi_array of same type but with different dimentionality