2015-03-06 2 views
0

У меня есть повышающий :: варианта: B неполный типа поэтому у меня есть два possibilitys объявить мой вариантподталкивания :: вариант с эталонным ограниченным типом, не может присвоить значение

typedef boost::variant<B*, char, int> vari; // this works 
typedef boost::variant<B&, char, int> vari; // this works also 

Но теперь я имеют следующую функцию, в которой я пытаюсь присвоить значение моего варианта:

void setVari(vari& v, const int n){ 
    swich(n) { 
    case 1 : 
     vari = 100; 
     break; 
    case 2 : 
     vari = 'a' 
     break; 
    case 3 : { 
     B elem; 
     vari = elem; // or "vari = *elem" if i use the pointer variant 
     break; 
     } 
    case default : 
     break; 
    } 
} 

Эта функция работает только тогда, когда я использую первый способ заявить свой вариант.

Если я использую ссылочный контент, компилятор жалуется на ошибки template argument deduction/substituiion failed.

Есть ли возможность использовать эту функцию при использовании ссылки вместо указателя?

+2

Что именно вы пытаетесь достичь? Определение структуры никогда не будет работать. Когда-либо. Я знаю несколько шаблонов с Boost Variant, которые решают практически любую задачу, но я не понимаю, какая задача является вашей целью. (Вместо того, чтобы показывать неудачный подход, опишите цель, которую вы пытаетесь достичь?) – sehe

+0

На данный момент: см. Ограничения на присвоение (перемещение), перечисленные [здесь] (http://www.boost.org/doc/libs/1_57_0/ doc/html/variant/reference.html): _Assignable: сам вариант Assignable, если и только если каждый из его ограниченных типов удовлетворяет требованиям концепции. (Обратите внимание, что типы и типы ссылочных типов верхнего уровня не отвечают этим требованиям.) _ И т. Д. – sehe

+0

Изменен вопрос .. надеюсь, что его теперь более понятно. Может кто-нибудь сказать мне, почему его вниз? Разве все еще не ясно? – Ventu

ответ

2

Варианты могут содержать ссылки, но это делает их неприемлемыми.

docs:

  • Assignable: вариант сам по себе Назначаемые тогда и только тогда, когда каждый из его ограниченных типов отвечает требованиям концепции. (Обратите внимание, что типы и типы ссылочных типов верхнего уровня не отвечают этим требованиям.)
  • MoveAssignable: Вариант сам по себе MoveAssignable тогда и только тогда, когда каждый из его ограниченных типов отвечает требованиям концепции. (Обратите внимание, что на высшем уровне константных квалифицированные типы и ссылочные типы не отвечают этим требованиям.)

Вы все еще можете сделать полезные вещи с ними (например, вернуть их). См. Например: boost variant copy semantics

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