对于我想在Foo
中使用的类型boost::variant
,我想将默认构造函数设置为private
,因为只允许boost::variant
调用它。 {1}}。
可悲的是,我还不知道boost::variant
的声明魔法,只是声明
struct Foo {
private:
Foo();
template <class T1, class T2>
friend class boost::variant<T1, T2>;
};
也没编译。有没有办法做到这一点,还是我需要保留Foo()
public
?
答案 0 :(得分:3)
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
答案 1 :(得分:1)
可变参数模板可用时,您必须使用template <BOOST_VARIANT_ENUM_PARAMS(class T)> friend class boost::variant;
,否则会出现错误:尚未声明“ BOOST_PP_REPEAT_1_BOOST_VARIANT_LIMIT_TYPES”。
这是最小的 working example :
#include <boost/variant.hpp>
#include <boost/preprocessor/repetition/enum_params.hpp>
struct Foo {
public:
Foo(int){};
private:
Foo();
template <BOOST_VARIANT_ENUM_PARAMS(class T)> friend class boost::variant;
int i;
};
int main()
{
Foo foo(10);
boost::variant<Foo> test=foo;
}