Мулипальная дефениция шаблона. Как с ней бороться?

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Сионист писал(а):А cpp остаётся один. У меня их 47, из них 46 инкладят шаблон.

Вот есть вот такой шаблон template <typename T> std::vector<T> { /* всякая муть */ }, он целиком лежит в .h файле. И его инклудят очень, очень много cpp файлов. Не задумывался почему?
2B OR NOT(2B) = FF
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Сионист писал(а):Нет. Арифменические - это и целые тоже, а их надо специализировать отдельно от действительных, и даже 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;
}
2B OR NOT(2B) = FF
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Сионист писал(а):Нет. Арифменические - это и целые тоже, а их надо специализировать отдельно от действительных, и даже char, а для него нужен тот же текст, как для не числовых.
Без проблем. В коде Absurd замени

Код: Выделить всё

std::is_arithmetic<Type>::value
на

Код: Выделить всё

std::is_same<Type, int>::value || 
std::is_same<Type, double>::value ||
...
и укажи там любые типы, которые тебе нужны.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить