2016-03-15 2 views
3

Рассмотрим на этот раз этот код. Не важно, что делает код, но как написан шаблон шаблона шаблона.C++ шаблоны и препроцессор C

С точки зрения плитки, код имеет ряд важных преимуществ.

  • гораздо меньше код шаблона.

  • Если вы решите взять больше параметров шаблона, вы измените только определение класса и #define.

Недостатки очевидны:

  • используя препроцессор

  • не так читаемый

  • просто странно

Есть ли что-нибудь стандартизован как это?


#include <cstdio> 

template<typename T> 
struct Summator{ 
    Summator(T v1, T v2); 

    T value1(); 
    T value2(); 

    T sum(); 

    bool great(); 

private: 
    T v1; 
    T v2; 
}; 


#define Summator_(type) template<typename T> type Summator<T> 


Summator_()::Summator(T v1, T v2) : v1(v1), v2(v2){}; 

Summator_(T)::value1(){ 
    return v1; 
} 

Summator_(T)::value2(){ 
    return v1; 
} 

Summator_(T)::sum(){ 
    return v1 + v2; 
} 

Summator_(bool)::great(){ 
    return v1 > v2; 
} 

int main(){ 
    Summator<int> s{ 5, 6 }; 

    printf("%d\n", s.sum()); 
} 
+0

Ближайший вероятно [ 'станд :: аккумулируют()'] (http://en.cppreference.com/w/cpp/algorithm/accumulate). –

+2

@ πάνταῥεῖ Я думаю, что он ссылается на использование 'Summator_' для сокращения определения шаблона * shiver *. – TartanLlama

+0

Не уверен, что я понял вопрос, но почему бы не использовать директиву C++ 11 'using'? –

ответ

1

Если я правильно понял ваш вопрос, вы хотите избежать необходимости писать весь шаблон перед каждым определением функции?

Я думаю, что большинство людей, которые заботятся об этом, полагаются на IDE для генерации пустых определений функций/реорганизации существующих функций?

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

1

Учитывая, что для большинства практических целей, функция-членов шаблонов классов должна быть рядным, вы можете также определить их в теле вызовов. Особенно для таких крошечных функций.

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

В этом стандарте нет ничего определенного, и я не уверен, что хочу, чтобы это было. Если вы это сделаете, запомните # позже определение define (потому что иначе вы будете загрязнять пространство имен #define пользователя вашего класса).

0

гораздо меньше код шаблона.

Нет, это же

, если вы решили взять больше параметров шаблона, можно изменить только определение класса и #define.

читать: если вы решите полностью изменить дизайн ...может быть, вы могли бы сэкономить ввод (но опять же, может быть, не)

используя препроцессор

Yup - так что не это никакого права там.

не так читаемый

так "нет" снова

просто странно

значения

Есть ли что-нибудь стандартизированы, как это?

явно не

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