2015-04-02 4 views
2

Для типа Foo, который я хочу использовать в boost::variant, я хотел установить конструктор по умолчанию private, так как это только должно быть позволено быть созвано boost::variant.повышение :: вариант в другом классе

К сожалению, я еще не мог понять, в декларации магии boost::variant и просто объявить

struct Foo { 
private: 
    Foo(); 
    template <class T1, class T2> 
    friend class boost::variant<T1, T2>; 
}; 

не компилировать либо. Есть ли способ сделать это или мне нужно сохранить Foo()public?

ответ

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

Я думаю, что это нет никакой гарантии, что код инстанцирования является 'повышением :: сам variant', а не один из его помощников. Но я не смотрел на реализацию. Возможно, это часть документального интерфейса. –

+0

@ Cheersandhth.-Alf Хорошая точка. Я ответил на вопрос «как подружиться с boost :: variant», «не более широким», как использовать частный ctor с «boost :: variant». Я оставлю его в ОП, чтобы выяснить, работает ли он на них или нет; Я желаю быть превзойденным лучшим ответом и/или вывести мои, если окажется, что этого недостаточно. – Angew

+0

Я проверил, что 'boost :: variant' выполняет экземпляр, прежде чем :). Тем не менее, предложение, по крайней мере, выдает синтаксическую ошибку на VS2010 в идентификаторе 'BOOST_PP_REPEAT_1_class'. – abergmeier

Смежные вопросы