Названный?параметры в шаблонах, функции - PullRequest
7 голосов
/ 18 ноября 2010

Есть ли какие-либо обновления в будущем стандарте C ++ 0x для именованных параметров в шаблонах и / или функциях? Например, я хотел бы иметь возможность написать следующее:

определив ранее:

template<class T = int,class Policy_1, class Policy_2>
class X
{
};

тогда в основном:

X<Policy_2: NoReturn> x;

то же самое с функциями; имеющий:

void f(int arg_1 = 0, int arg_2 = 1, int arg_3 = 2)
{
}

затем в основном:

f(arg_3: 55);

Ответы [ 5 ]

9 голосов
/ 18 ноября 2010

Для функций вы можете использовать идиому Именованных параметров (как в C ++ 98, так и в C ++ 0x).

См. Пункт C ++ FAQ 10.20 Что такое "Идиома именованного параметра "? .

Для аргументов шаблона я думаю, что вы можете использовать идею обтекания, используя типы" носителя типа ", которые по типу кодируют, какой аргумент шаблона они представляют.Это становится сложным.Вы можете проверить библиотеку Boost Parameters для идей, но, по сути, для шаблонных аргументов я не думаю, что стоит тратить время (не говоря уже о фактическом использовании) - это академично.

Cheers & hth.,

8 голосов
/ 18 ноября 2010

Не с этим синтаксисом, и хотя использовать такие конструкции становится проще, их создание довольно грязное.

См. Boost.Parameter

В итоге вы получите

typedef template_by_named< policy1<type1>, policy2<type2> > x;

и

f(param_b = 23, param_d = 42)
0 голосов
/ 13 мая 2017

В этой статье описывается метод, который можно использовать для эмуляции именованных параметров шаблона.

Пример синтаксиса:

enum class bars { bar1, bar2, bar3 };

// Omitted definitions of get_value, is_present, get_type, a, b, c and d.

template <typename... Args>
struct foo {
    static constexpr auto A = get_value<a<1>, Args...>::value;
    static constexpr auto B = get_value<b<bars::bar2>, Args...>::value;
    static constexpr auto C = is_present<c, Args...>::value;

    using D = typename get_type<d<char>, Args...>::value;
};

// Client code
foo<d<float>, a<42>> f;
// f::A equals to 42;
// f::B equals to defaulted bars::bar2;
// f::C equals to false, because c is not present among temlate arguments;
// f::D equals to float
0 голосов
/ 18 ноября 2010

Остальные из нас просто использовали структуры аргументов и преодолели их.И нет.

0 голосов
/ 18 ноября 2010

Нет, это не сработает в C ++ 0x.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...