У меня есть, казалось бы, простой вопрос, который я не знаю, как решить.Перегрузка шаблона (справочная и неосновная версия)
Представьте себе следующий метод шаблона
template<typename T> void Add(T& var);
где специализации могут добавить что-то в контейнер (вроде). Я могу передать POD
или более сложные типы, такие как strings
, и именно поэтому я передаю T в качестве ссылки.
Проблема с этим состоит в том, что всякий раз, когда я хочу позвонить Добавить (...) с результатом другого способа, как:
Add(MethodThatReturnsAnInt());
Это не будет работать и временная переменная необходима, чтобы удерживать результат MethodThatReturnsAnInt()
.
Есть ли способ перегрузки Add
, чтобы у меня была эталонная версия для передачи и без ссылки?
template<typename T> void Add(T& var);
template<typename T> void Add(T var);
бы std::enable_if
никакой пользы в этой ситуации?
Читайте и узнайте о [ссылках на rvalue] (http://en.cppreference.com/w/cpp/language/reference). –
Google _forwarding reference_. Ваша ситуация и результирующий вопрос были настолько распространены, что они добавили для него языковую функцию. ;-) Это фундаментальная особенность C++ 11 и, вероятно, уже достаточно долгое время. –
Какую проблему вы на самом деле пытаетесь решить? Что делает 'Add()' do? – Barry