Han*_*ård 4 c++ templates boost template-meta-programming c++14
我有一个继承自的模板类(从现在开始作为父级引用).
模板类初始化包含子类中指定的类和构造函数的融合列表成员变量.
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)...) {}
};
Run Code Online (Sandbox Code Playgroud)
子类的示例:
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>"
)) {};
};
Run Code Online (Sandbox Code Playgroud)
当我创建这样的子类时,我必须在列表中指定类的类型两次:
一旦进入"继承自"规范:
class XMLSignatureDocument : public ElementContainer<XMLDeclarationElement, SignatureXMLElement>
Run Code Online (Sandbox Code Playgroud)
当我指定各个类的构造函数参数时:
XMLSignatureDocument() :ElementContainer(
XMLDeclarationElement("<?xml version=\"1.0\" encoding=\"utf-8\"?>"),
SignatureXMLElement("<Signature xmlns=\"http://www.w3.org/2000/09/xmldsig#\"></signature>"
)) {};
Run Code Online (Sandbox Code Playgroud)
我想只需要指定一次 - 当我还指定构造函数参数时,如下所示:
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>"
)) {};
};
Run Code Online (Sandbox Code Playgroud)
并且仍然在父类中创建列表的编译时间.
如果不可能,我没有100%锁定在这个设计中 - 如果有可能与另一个设计并完成相同的我想听到它.
我正在使用Visual Studio 2014(v140)(c ++ 14)工具集进行编译和boost库.
您可以执行相反的操作:在类声明中指定类型,并对构造函数参数使用通用初始化语法(尽管它不适用于显式构造函数):
class XMLSignatureDocument : public ElementContainer<XMLDeclarationElement, SignatureXMLElement>
{
public:
XMLSignatureDocument() :ElementContainer(
{"<?xml version=\"1.0\" encoding=\"utf-8\"?>"},
{"<Signature xmlns=\"http://www.w3.org/2000/09/xmldsig#\"></signature>"}
) {};
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
107 次 |
| 最近记录: |