c++ - 继承时删除重复的模板类型名条目

标签 c++ templates boost c++14 template-meta-programming

我有一个继承自的模板类(从现在开始作为父类引用)。

模板类初始化一个 fusion 列表成员变量,其中包含子类中指定的类和构造函数。

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 库。

最佳答案

您可以做相反的事情:在类声明中指定类型,并对构造函数参数使用通用初始化语法(尽管它不适用于显式构造函数):

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>"}
        ) {};
};

关于c++ - 继承时删除重复的模板类型名条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30235472/

相关文章:

c++ - 为两种 vector 类型或一种 vector 类型与标量类型之间的二元运算结果确定正确的大小类型

c++ - 存储对具有不同类的对象成员变量的引用

c++ - 如何解锁 boost::upgrade_to_unique_lock(由 boost::shared_mutex 制成)?

c++ - 为什么 boost locale 不提供字符级规则类型?

c++ - 使用两个对象作为 unordered_map 或替代方案的哈希键

c++ - 如何使用 NVIDIA cuDNN 计算 'full' 卷积?

c++ - 从一个或多个线程访问 std::list

c++ - 将模板函数传递给另一个模板函数

c++ - 使用 MS SSPI 实现安全 SLL/TLS 客户端的可编译 C++ 代码

c++ - NetBeans 6.9、CMake 和 C++ : How to specify the build path?