Страница 2 из 2
Re: Мулипальная дефениция шаблона. Как с ней бороться?
Добавлено: 26 ноя 2015, 16:16
Absurd
Сионист писал(а):А cpp остаётся один. У меня их 47, из них 46 инкладят шаблон.
Вот есть вот такой шаблон template <typename T> std::vector<T> { /* всякая муть */ }, он целиком лежит в .h файле. И его инклудят очень, очень много cpp файлов. Не задумывался почему?
Re: Мулипальная дефениция шаблона. Как с ней бороться?
Добавлено: 26 ноя 2015, 16:23
Absurd
Сионист писал(а):Нет. Арифменические - это и целые тоже, а их надо специализировать отдельно от действительных, и даже char, а для него нужен тот же текст, как для не числовых.
Используй частичную специализацию. Тут надо конечно избежать дублирования кода, но не суть важно.
Код: Выделить всё
#include <iostream>
#include <type_traits>
#include <sstream>
template <bool Q> struct Bool2Type {
enum { Value = Q };
};
template <typename Type> class TypeInformation {
static std::wstring get(Bool2Type<false>)
{
std::wostringstream Result;
Result << L"<Name>" << typeid(Type).name() << "</Name>\n";
Result << L"<Terms>" << sizeof(Type) << L"</Terms>\n";
return Result.str();
}
static std::wstring get(Bool2Type<true>)
{
std::wostringstream Result;
Result << L"<Name>" << typeid(Type).name() << "</Name>\n";
Result << L"<Terms>" << sizeof(Type) << L"</Terms>\n";
Result << L"<Min>" << std::numeric_limits<Type>::min() << L"</Min>\n";
Result << L"<Max>" << std::numeric_limits<Type>::max() << L"</Max>\n";
return Result.str();
}
public:
static std::wstring get()
{
return get(Bool2Type< std::is_arithmetic<Type>::value >());
}
};
template <> class TypeInformation<char> {
public:
static std::wstring get()
{
std::wostringstream Result;
Result << L"<Name>" << typeid(char).name() << "</Name>\n";
Result << L"<Terms>" << sizeof(char) << L"</Terms>\n";
return Result.str();
}
};
int main()
{
std::wcout << L"----------------------------------------\n";
std::wcout << TypeInformation<std::string>::get();
std::wcout << L"----------------------------------------\n";
std::wcout << TypeInformation<char>::get();
std::wcout << L"----------------------------------------\n";
std::wcout << TypeInformation<unsigned char>::get();
std::wcout << L"----------------------------------------\n";
std::wcout << TypeInformation<int>::get();
std::wcout << L"----------------------------------------\n";
std::wcout << TypeInformation<unsigned>::get();
std::wcout << L"----------------------------------------\n";
std::wcout << TypeInformation<double>::get();
std::wcout << L"----------------------------------------\n";
return 0;
}
Re: Мулипальная дефениция шаблона. Как с ней бороться?
Добавлено: 26 ноя 2015, 16:26
Romeo
Сионист писал(а):Нет. Арифменические - это и целые тоже, а их надо специализировать отдельно от действительных, и даже char, а для него нужен тот же текст, как для не числовых.
Без проблем. В коде
Absurd замени
на
Код: Выделить всё
std::is_same<Type, int>::value ||
std::is_same<Type, double>::value ||
...
и укажи там любые типы, которые тебе нужны.