LINUX.ORG.RU

Почему в CppCMS в handle-рах используется передача по значению, а не по ссылке или по указателю?

 , cppcms


0

1

Из этой статьи http://habrahabr.ru/post/252215/

Есть код

class MyApplication : public cppcms::application
{
public:
    explicit MyApplication(cppcms::service &service) :
        cppcms::application(service)
    {
        dispatcher().assign("/file/\\d+", &MyApplication::handleFile, this, 1);
        mapper().assign("/file", "/file/{1}");
    }
    void handleFile(std::string fileNo)
    {
        //тут обрабатываем запрос
    }
};

Почему не void handleFile(const std::string &fileNo)?

Ответ на: комментарий от Chaser_Andrey

Да ничем наверное :) Прост в статье его не было, а кто то на моей памяти очень хвалил это поделие.

pon4ik ★★★★★
()

Вообще-то это надо бы спрашивать у авторов CppCMS :) Ну или посмотреть в их исходники.

Навскидку, если там используется C++11, то за счет move semantic на таком вызове ничего не теряется. Где-то в дебрях CppCMS создается объект std::string со значением, которое нужно передать в handleFile. Если это значение больше нигде не используется, то оно просто перемещается в параметр handleFile (что-то вроде target->handleFile(std::move(param))).

Зато внутри handleFile появляется возможность модифицировать параметр fileNo не делая его копию.

Кроме того, если внутрях CppCMS плотно используются шаблоны, то например, разбирать типы параметров функции, указатель на которую передается в dispatcher().assign() в шаблонах чуточку проще, если там используется T, а не const T & или что-то подобное.

eao197 ★★★★★
()
Ответ на: комментарий от eao197

Зато внутри handleFile появляется возможность модифицировать параметр fileNo не делая его копию.

Хорошей практикой в случаях является передача по const-ссылке с послежующим явным копированием. Если, конечно, передача по значению для этого типа не является предпочтительной.

annulen ★★★★★
()
Ответ на: комментарий от annulen

Хорошей практикой в случаях является передача по const-ссылке с послежующим явным копированием.

Перечитайте внимательно еще раз. Если внутри CppCMS значение параметра fileNo не нужно, то это значение выталкивается в handleFile и все (здесь требуется move semantic из C++11). Если разработчику нужна внутри handleFile модификация значения, он ее сделает без каких-либо копий.

То, что вы описываете как «хорошую практику» требует в таком случае двух копий значения параметра fileNo: одна в потрохах CppCMS (и на это значение будет передаваться константная ссылка), вторая внутри handleFile.

eao197 ★★★★★
()
Ответ на: комментарий от eao197

одна в потрохах CppCMS (и на это значение будет передаваться константная ссылка)

Если по конст-ссылке передается r-значение, то оно не копируется

вторая внутри handleFile

Согласен. Тогда предлагаю принимать r-ссылку, чтобы копирования гарантированно не было

annulen ★★★★★
()

так это походу C++11, который, вестимо, != C++

unt1tled ★★★★
()

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

slovazap ★★★★★
()
Ответ на: комментарий от annulen

Согласен. Тогда предлагаю принимать r-ссылку, чтобы копирования гарантированно не было

Не нужно ничего усложнять. Если есть аналог вот такого кода:

#include <string>
#include <iostream>

int main()
{
	std::string tmp{ "dummy" };
	[]( std::string p ) {
		p += "-example";
		std::cout << "'" << p << "'" << std::endl;
	}( std::move(tmp) );

	std::cout << "'" << tmp << "'" << std::endl;
}

То копирования гарантированно не будет. Будет перемещение значения в параметр вызываемой функции.

eao197 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.