对于我想在 boost::variant
中使用的类型 Foo
,我想将默认构造函数设置为 private
,因为它只应该被允许由 boost::variant
调用。
遗憾的是我还无法弄清楚 boost::variant
的声明魔法并简单地声明
struct Foo {
private:
Foo();
template <class T1, class T2>
friend class boost::variant<T1, T2>;
};
也没有编译。有什么办法可以做到这一点还是我需要保留 Foo()
public
?
最佳答案
[此答案仅针对 C++98/03;对于现代代码,请参见下文]
boost::variant
的模板参数数量由 BOOST_VARIANT_LIMIT_TYPES
给出。您可以通过利用 Boost.Preprocessor 来使用它:
#include "boost/preprocessor/repetition/enum_params.hpp"
struct Foo {
private:
Foo();
template <BOOST_PP_ENUM_PARAMS(BOOST_VARIANT_LIMIT_TYPES, class T)>
friend class boost::variant;
};
boost::variant
被声明为带有 BOOST_VARIANT_LIMIT_TYPES
模板参数的类模板,因此您必须这样引用它。这是 BOOST_PP_ENUM_PARAMS(a, b)
的工作,它扩展为 a
逗号分隔项的列表,每个项都是 b
附加一个唯一的编号。例如,
BOOST_PP_ENUM_PARAMS(5, class T)
将扩展为:
class T0, class T1, class T2, class T3, class T4
请注意,上述内容适用于问题范围,即仅限于 C++98/03。从 C++11 开始,就存在可变参数模板,当这些模板可用于 Boost 时,BOOST_VARIANT_LIMIT_TYPES
未定义,并且上述代码不起作用。 Boost 提供了一种可以在有或没有变量的情况下工作的替代方案;请参阅this answer了解详情。
关于c++ - boost::作为友元类的变体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29409677/