【发布时间】:2015-05-14 10:51:51
【问题描述】:
我有一个继承自的模板类(从现在开始作为父类引用)。
模板类初始化一个融合列表成员变量,其中包含子类中指定的类和构造函数。
template<typename... ITEM_TYPES>
using List = boost::fusion::list<ITEM_TYPES...>;
template<typename... CHILDREN_TYPES>
class ElementContainer
{
protected:
const List<CHILDREN_TYPES...> children;
public:
ElementContainer(CHILDREN_TYPES&&... args) : children(forward<CHILDREN_TYPES>(args)...) {}
};
子类示例:
class XMLSignatureDocument : public ElementContainer<XMLDeclarationElement, SignatureXMLElement>
{
public:
XMLSignatureDocument() :ElementContainer(
XMLDeclarationElement("<?xml version=\"1.0\" encoding=\"utf-8\"?>"),
SignatureXMLElement("<Signature xmlns=\"http://www.w3.org/2000/09/xmldsig#\"></signature>"
)) {};
};
当我创建这样一个子类时,我必须在列表中指定类的类型两次:
曾经在“继承自”规范中:
class XMLSignatureDocument : public ElementContainer<XMLDeclarationElement, SignatureXMLElement>
以及当我指定各个类的构造函数参数时:
XMLSignatureDocument() :ElementContainer(
XMLDeclarationElement("<?xml version=\"1.0\" encoding=\"utf-8\"?>"),
SignatureXMLElement("<Signature xmlns=\"http://www.w3.org/2000/09/xmldsig#\"></signature>"
)) {};
我只想指定一次 - 当我还指定构造函数参数时,如下所示:
class XMLSignatureDocument : public ElementContainer<...>
{
public:
XMLSignatureDocument() :ElementContainer(
XMLDeclarationElement("<?xml version=\"1.0\" encoding=\"utf-8\"?>"),
SignatureXMLElement("<Signature xmlns=\"http://www.w3.org/2000/09/xmldsig#\"></signature>"
)) {};
};
并且仍然在父类中创建列表的编译时间。
如果不可能,我不会 100% 锁定在这个设计中 - 如果其他设计有可能并且完成同样的事情,我想听听。
我正在使用 Visual Studio 2014 (v140)(c++14) 工具集进行编译和 boost 库。
【问题讨论】:
标签: c++ templates boost c++14 template-meta-programming