如何转发声明一个模板类型,该模板类型已在默认情况下向前声明

时间:2018-01-17 13:38:30

标签: c++ templates metaprogramming forward-declaration default-arguments

因此this question的优秀答案表明您可以在前向声明中默认模板类型,但是:

  

您只能指定一次默认模板参数

这在链接问题中有更全面的说明,但Boost的属性树内容适用于ptree类型:

typedef basic_ptree<std::string, std::string> ptree;

basic_ptree类定义如下:

template<class Key, class Data, class KeyCompare>
class basic_ptree

ptree typedef仅使用2个模板参数定义的唯一原因是在typedef之前有前向声明:

template < class Key, class Data, class KeyCompare = std::less<Key> >
class basic_ptree;

这让我想到了我的实际问题。我需要绕过ptree。但我不想在我的标题中加入Boost。这意味着我必须转发声明。 但是我无法匹配默认的前向声明,因为默认只能声明一次。

如何编写前向声明和转发typedef,这取决于另一个标头前向声明中的默认值?

我目前正在这样做,但这意味着我转发typedef,我正在制作 typedef

template <class Key, class Data, class KeyCompare> class basic_ptree;
typedef basic_ptree<std::string, std::string, std::less<std::string>> ptree; 

为了保持一致性,我希望依赖原始basic_ptree ptree所依赖的typedef默认的默认声明。

1 个答案:

答案 0 :(得分:1)

简短的回答是你无法做到。您要么必须保证不会包含其他声明,以便您可以指定自己的默认值,或者您需要依赖其他声明。

但我觉得这是一个XY problem,对于以下声明:

  

但我不想在我的标题中包含Boost。

为什么不呢?您的代码显然依赖于Boost的ptree,因此使用您的代码的任何人都必须安装Boost。如果您希望在未安装Boost时编译声明,则有以下几种选择:

  • 确保使用预处理程序指令(ptree / #if块)排除使用#endif的位
  • 使用C ++ 17 __has_include()来测试<boost/property_tree/ptree.hpp>是否存在,然后将其包括在内(如果存在),或者声明自己的ptree如果它不存在&select {width: 100%;} #39;吨