Как вы заставляете компилятор передавать некоторую переменную по ссылке в C ++? - PullRequest
4 голосов
/ 23 июля 2011

Вот простой пример:

template <typename T>
void foo(T t) {}

std::string str("some huge text");
foo(str);

Мой вопрос: как заставить компилятор передавать str по ссылке без изменения функции foo?

Ответы [ 4 ]

9 голосов
/ 23 июля 2011

Явно передайте ссылочный тип:

template <typename T>
void foo(T t) {}

int main() {
   std::string str("some huge text");
   foo<std::string&>(str);
}

Это делает изменяющим экземпляр функции, который вы получаете (генерируя void foo<std::string&>(std::string& t)), но не изменяет функциюшаблон.

Демонстрационная версия.

2 голосов
/ 23 июля 2011

Вы можете обойти вывод аргумента шаблона и явно передать std::string&.

0 голосов
/ 23 июля 2011

boost :: reference_wrapper также должен решить вашу проблему.

0 голосов
/ 23 июля 2011

Помимо других ответов, вы также можете подумать о перегрузке foo():

template <typename T>
void foo(T t) {}

void foo(std::string &t) {}

std::string str("some huge text");
foo(str);

Таким образом, вы не измените фактическое поведение foo() и не завершите свою работу с перегруженной версией.

...