2016-11-11 21 views
1

У меня есть переменная оболочка, которая сигнализирует об изменениях, когда базовая переменная изменяется через эту оболочку, поэтому другие объекты могут прослушивать изменения.Есть ли способ заставить автоматический вывод считать оператора <some_type>() над назначением копии?

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

struct some_object_type 
{ 
    wrapper<int> some_wrapper; 
} 

int main() 
{ 
    some_object_type some_object; 
    auto value = some_object.some_wrapper; 
} 

value здесь правильно выведено как wrapper<int>. Есть ли способ заставить эту конструкцию вести себя так, как если бы some_object.some_wrapper имеет тип int, так что value выводится как переменная int?

+0

Почему вы хотите, чтобы тип 'some_wrapper' выводился как' int', если он не является 'int'? – Peter

+2

Вы можете «удалить» конструктор копирования для 'some_wrapper' и написать оператор неявного преобразования в' T'. Это разумно для вас? – TartanLlama

+0

'auto value = ...' является примером построения копии, а не присваивания. – KyleKnoepfel

ответ

0

@TartanLlama имеет правильное решение в своем комментарии. Однако, что бы вам хотелось auto вывести, если бы вы указали auto const& value = ...? В этом случае неявное преобразование не будет работать.

Я столкнулся с этой проблемой раньше, и самое лучшее решение, которое я мог придумать было обеспечить wrapper<T>::operator() функцию:

struct some_object_type 
{ 
    wrapper<int> some_wrapper; 
} 

int main() 
{ 
    some_object_type some_object; 
    auto value1 = some_object.some_wrapper; // deduces to wrapper<int> 
    auto value2 = some_object.some_wrapper(); //deduces to int  
} 

Может быть, не решение, которое вы надеялись, но если вы не отказаться от автоматического тип вычета, вы лучший курорт, это предложение @ TartanLlama.

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

  • Нет связанных вопросов^_^