2010-11-17 2 views
5

Есть ли какое-либо обновление в предстоящем стандарте 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); 

ответ

9

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

См. Раздел C++ FAQ 10.20 What is the "Named Parameter Idiom"?.

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

Приветствия & НТН.,

+0

+1 за то, что не ошибочно заявлял, что это невозможно: p –

+1

Я нашел много пользы для его хотя. При работе с политическим дизайном, где может быть 10 или более параметров шаблона, это ОЧЕНЬ полезно. Boost.Parameter создает беспорядочный код реализации, но чистые и простые в использовании интерфейсы. –

+0

@Noah: для этого достаточно MPL (в сочетании с идеей несущей типа). Другое решение, которое я нашел, - это просто попросить определить внутренний тип 'tag' в каждой политике, которая идентифицирует, к какой категории она принадлежит.Оба они относительно худые. –

0

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

8

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

См Boost.Parameter

Вы в конечном итоге с

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

и

f(param_b = 23, param_d = 42) 
+3

Иногда мне интересно, если есть что-нибудь Дейв Абрахамс не мог писать в C++ ... –

-4

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

+8

-1 бесцельно неприятны и бесполезен. –

+1

+1, достаточно краткий и правдивый. – MSN

+0

Я бы указал на http://www.boost.org/doc/libs/1_44_0/libs/parameter/doc/html/index.html – KitsuneYMG

0

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

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

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 
Смежные вопросы