2012-05-10 3 views
2

Можно ли сделать такШаблон в макросах на C++?

# define abc<T1> __abc<T1, T2> 

template<typename T2> void somefun() { 
    ... 
    abc<int>(...); 
    abc<double>(...); 
    ... 
} 

Просто не писать его каждый раз, когда я называю а

+4

(примечание: '__abc' зарезервировано) – Flexo

+1

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

ответ

7

В C++ 11 вы можете сделать:

template<typename T2> void somefun() { 
    template <typename T> 
    using abc = __abc<T, T2>; 
} 

Без этого вы можете использовать макрос, но вам нужно будет:

#define abc(T1) __abc<T1, T2> 

//usage: 

abc(Type) instance; 

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

Если вы хотите, чтобы избежать макросоци- обработки перед C++ 11 вы можете сделать что-то вроде:

template <typename T2> 
struct type { 
    template <typename T1> 
    struct lookup { 
    typedef __abc<T1,T2> type; 
    }; 
}; 

template <typename T2> void somefun() { 
    typedef type<T2> abc; 
    typename abc::template lookup<int>::type(); 
} 

Но положа руку на сердце, что это менее читаемыми, чем даже макро случае

(Примечание: __abc зарезервировано)

+1

Я бы не использовал макрос, введите его полностью. Это неестественно выглядит и путает других и себя, когда стареет. Кроме того, он существует в файле заголовка и может вызвать проблемы с кодом вне заголовка. – Beached

2

Да, но вам нужно использовать круглые круглые скобки.

# define abc(T1) __abc<T1, T2> 

template<typename T2> void somefun() { 
    ... 
    abc(int)(...); 
    abc(double)(...); 
} 

Редактировать: Моя рекомендация не использует макросы для этой аббревиатуры вообще. Используйте решение для awoodlands или, возможно, параметр шаблона по умолчанию. И ты не должен использовать зарезервированные имена.

+1

Интересно, и это работает, но делает код сложнее и труднее понять, потому что он похож на C-style casting :) – user1386738

+0

Вы просили его, и вы его получили ;-) – hirschhornsalz

+1

@ user1386738: «Он работает, но делает код сложнее и труднее понять "относится к большинству, если не ко всем макросам. – MSalters

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