Было бы хорошей идеей создать кортежи, такие как Initializer_list, разных типов?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Было бы хорошей идеей создать кортежи, такие как Initializer_list, разных типов?

Сообщение Anonymous »

Код: Выделить всё

std::initializer_list
встроен в язык. Если бы std::tuple имел одинаковую обработку, std::initializer_list стал бы «особым» случаем для std::tuple, где все типы одинаковы.
Я хотел упростить код, который вызывает одну и ту же функцию с другим набором или параметрами:

Код: Выделить всё

auto val = QueryRegString(HKEY_LOCAL_MACHINE, L"Windows Kits\\Installed Roots", L"KitsRoot10");
/// work with val
val = QueryRegString(HKEY_LOCAL_MACHINE, L"Windows Kits\\Installed Roots", L"KitsRoot81");
/// work with val
val = QueryRegString(HKEY_LOCAL_MACHINE, L"Microsoft SDKs\\Windows\\v7.1", L"InstallationFolder");
/// work with val
Я хотел переписать это так:

Код: Выделить всё

const auto regs[] = {
{HKEY_LOCAL_MACHINE, L"Windows Kits\\Installed Roots", L"KitsRoot10"},
{HKEY_LOCAL_MACHINE, L"Windows Kits\\Installed Roots", L"KitsRoot81"},
{HKEY_LOCAL_MACHINE, L"Microsoft SDKs\\Windows\\v7.1", L"InstallationFolder"},
};
for (const auto& reg : regs)
{
auto val = QueryRegString(std::get(reg), std::get(reg), std::get(reg));
/// work with val
}
Однако это не работает, поскольку auto нельзя использовать с массивами.
Но это работает:

Код: Выделить всё

const auto regs = {
std::make_tuple(HKEY_LOCAL_MACHINE, L"Windows Kits\\Installed Roots", L"KitsRoot10"),
std::make_tuple(HKEY_LOCAL_MACHINE, L"Windows Kits\\Installed Roots", L"KitsRoot81"),
std::make_tuple(HKEY_LOCAL_MACHINE, L"Microsoft SDKs\\Windows\\v7.1", L"InstallationFolder"),
};
по сути, это становится инициализатором_списка кортежей. Если бы кортежи были встроены в язык, аналогичный списку инициализаторов, мы могли бы просто написать что-то вроде этого:

Код: Выделить всё

const auto regs = {
{HKEY_LOCAL_MACHINE, L"Windows Kits\\Installed Roots", L"KitsRoot10"},
{HKEY_LOCAL_MACHINE, L"Windows Kits\\Installed Roots", L"KitsRoot81"},
{HKEY_LOCAL_MACHINE, L"Microsoft SDKs\\Windows\\v7.1", L"InstallationFolder"},
};
for (const auto& reg : regs)
{
auto val = QueryRegString(std::get(reg), std::get(reg), std::get(reg));
/// work with val
}
или еще лучше сделать массив выведенных кортежей:

Код: Выделить всё

const auto regs[] = { ... };
Есть ли в стандарте C++ что-нибудь, что позволит ему работать в будущем?


Подробнее здесь: https://stackoverflow.com/questions/798 ... erent-type
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»