C ++: значение локальной ссылочной переменной на основе условия - PullRequest
0 голосов
/ 20 апреля 2020

Я думал о том, как использовать локальную переменную, которая была объявлена ​​как ссылочный тип. Я нашел это бесполезным, потому что везде, где я использую переменную ref, я вполне могу использовать только переменную, ссылку на которую я назначил Пока я не понял, что переменная ref может ссылаться на переменную, которую трудно вычислить.

Поэтому я "изобрел" этот код:

system::path& pathSeparator;

if( system::is_mswindows() ) {
    pathSeparator = long::namespace::access::path::mswindows::pathSeparator;
} else {
    pathSeparator = long::namespace::access::path::posix::pathSeparator;
}

/* code which uses pathSeparator a lot */

, но я получаю ошибку, потому что pathSeparator не присваивается значение при его инициализации в первой строке примера кода. Если я делаю то же самое с pathSeparator, объявленным в качестве указателя, тогда он работает нормально, но теперь я вынужден разыменовывать переменную каждый раз, когда использую ее.

Итак, возможно ли использовать ссылочную переменную, ссылка на которую основана на условии, для кода, который много использует переменную (чтобы не записывать if-s каждый раз, когда коду требуется его значение)

1 Ответ

1 голос
/ 20 апреля 2020

Вы можете использовать условный оператор:

system::path& pathSeparator = system::is_mswindows()
    ? long::namespace::access::path::mswindows::pathSeparator
    : long::namespace::access::path::posix::pathSeparator;

... или, если вам нужно больше места, немедленно вызвать лямбду:

auto& pathSeparator = [&]() -> system::path& {
    if( system::is_mswindows() ) {
        return long::namespace::access::path::mswindows::pathSeparator;
    } else {
        return long::namespace::access::path::posix::pathSeparator;
    }
}();
...