boost :: variant作为朋友类

时间:2015-04-02 09:39:26

标签: c++ boost c++98 boost-variant

对于我想在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

2 个答案:

答案 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;
}