2016-04-14 2 views
0

Можно ли сделать что-то вроде:typedef шаблон, возможно ли это?

template< typename T > 
using T_CCUnit = static const constexpr T; 

На самом деле я просто хочу псевдоним static const constexpr, потому что это очень скучно писать каждый раз в какой-то файл. Я предпочту решение в C++ 11.

ответ

3

Вы можете добавить константный-ность к типу достаточно легко, потому что CV-отборочные изменить тип:

template <typename T> 
using T_C = std::add_const_t<T>; 

Однако static и constexpr изменять объявления, а не типов. Так, здесь:

      int x1; 
        const int x2; 
    static   const int x3; 
    static constexpr const int x4; 
//  | ^ | type |name 
// ^| constexpr specifier 
// storage class specifier 

последние три декларации все типа const int, но x2 имеет различный класс хранения для и x4.

Честно говоря, если основная проблема заключается в том, что

... это действительно скучный писать ...

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

+0

Я останусь на макросе, как сказал тейваз. Спасибо за детали! Фрагменты этого не сделают, потому что я делаю много объявления флага, и это будет беспорядок со всеми этими ключевыми словами. –

0

Я думаю, что лучшим решением для вас будет использование макроса для этого.

#define STATIC_CONST_CONSTEXPR static const constexpr

А если серьезно, static и constexpr не являются модификаторы типа. Все, что вы можете сделать с using в вашем случае - const T. Все остальное вы либо пишете, либо попросите препроцессора написать для вас.

+0

Да, вы правы. Я был так сосредоточен, чтобы найти метод «C++», который я забыл простейший из них: macro. Я немного подожду, если у кого-то есть другая идея. –

0

Квалификатор хранения static применяется к экземплярам, ​​а не к типам. Так что невозможно typedef.

0

Вы не можете ввести typedef static или constexpr - они не являются частью этого типа. Тем не менее, даже если вы не могли бы, никто не будет знать, что:

T_CCUnit<int> x = 4; 

средства, но все будут знать, что:

static constexpr int x = 4; 

средства. Стоит набирать лишние 7 символов каждый раз, чтобы сделать ваш код более разборчивым. Все читатели вашего кода и ваше будущее будут благодарны вам.


Side-нотная, const дублирует constexpr - каждая переменная объявлена ​​constexpr неявно const.

+0

Я знаю, что я говорил о C++ 11, но constexpr не более const в C++ 14. Поэтому, если я смогу перейти на C++ 14, у меня возникнут проблемы. –

+0

@MathieuVanNevel «Спецификатор' constexpr', используемый в объявлении объекта, объявляет объект как 'const'. [\ [dcl.constexpr \]] (http://eel.is/c++draft/dcl.constexpr#9) – Barry

+0

О, кажется, что вы правы в отношении статического члена, оговорка говорит только о нестационарном члене. Немного странно, но почему бы и нет, я попробую, спасибо. –

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