2016-01-11 2 views
0

Я хотел бы упростить типирование auto const*const конструкции, создавая что-то вроде ЬурейеЕМожет ли `auto const * const` вводиться в однотипный тип?

// (pseudocode) 
using deepcp=auto const*const; 
deepcp a=f(1),b=f(2),c=f(3); 
auto lam=[](deepcp x,deepcp y,deepcp z){ return *x+*y+*z; }; 

Могу ли я добиться чего-то вроде tihs с C++? Может быть, шаблонные псевдонимы помогут?

ответ

3

Предполагая f является функцией (а не какой-то макрос, который возвращает разные типы), и f возвращает некоторое сырье типа указателя, вы можете использовать decltype:

using ret_f_t = decltype(f(1)); 
using pointee_t = std::pointer_traits<ret_f_t>::element_type; 
using deepcp std::add_const<pointee_t>::type * const; 

Или, как одна линия фетиш:

using deepcp = std::add_const< 
    std::pointer_traits<decltype(f(1))>::element_type 
>::type * const ; 

Yay.

Примечание: Я использовал add_const, потому что я не знаю, из вашего примера, возвращает ли f указатель или константный указатель, то есть, если pointee_t является сопзЬ или нет - это так, как это работает для обеих возможностей.

[Example]

+0

Хм, отлично выглядит для инициализации переменных, но, похоже, не является достаточно общим для другой строки в примере OP - generic lambda. – Ruslan

+0

Ну да, я думаю, я не был достаточно явным в OP. Лямбда должна была быть полностью общей. То есть он должен принимать вызов, например, например. 'Лам (getIntPtr(), getDoublePtr(), getMyCustomTypePtr())'. Думаю, это слишком много, потому что «auto» имеет совершенно иное значение для общих лямбда, чем для переменных. – Ruslan

+0

@ Ruslan ах я вижу. Ну, для начала вы не играете на верхний уровень const. И другая константа тоже не является жизненно важной - если ваша проблема не сложнее, чем пример. Поэтому просто используйте '[] (авто, авто, авто)' и разыгрывайте все, что приходит. Имеет то преимущество, что он также будет работать, если вы передадите интеллектуальные указатели. –

0
#define deepcp auto const * const 

сделает ваши торги

+0

Нет, не будет. 'b' и' c' будут объявлены 'auto const', а не' auto const * const', не так ли? – Ruslan

+1

Да. Поэтому не делайте этого - объявляйте каждую переменную отдельно. –

+1

Я думаю, что это как можно ближе. –

Смежные вопросы