История изменений
Исправление pon4ik, (текущая версия) :
Хотя не, с классами тоже можно, но выйдет многобуков:
//dump.hpp
#include <iostream>
//generic case
template <typename T>
struct Dump {
Dump(const T& d) {
std::cout << "Generic case:" << d << std::endl;
}
};
// forward declarations
// specializations
template <> struct Dump<std::string> {
Dump(const std::string&s);
};
// string_dump.cpp || all_special_dumps.cpp
#include "dump.hpp"
#include <string>
Dump<std::string>::Dump(const std::string& d) {
std::cout << "String case:" << d << std::endl;
}
// main.cpp
#include "dump.hpp"
int main(int argc, char* argv[]){
Dump<int>(43);
Dump<std::string>("42");
return 0;
}
Из плюсов такого подхода:
- код специализаций сокрыт
- код специализаций содержится в библиотеке а не в каждом её клиенте
- код специализаций можно разделять между двумя бинарниками (пример либа A зависит от dump, либа B зависит от dump, приложение зависит от A и B)
Исходная версия pon4ik, :
Хотя не, с классами тоже можно, но выйдет многобуков:
//dump.hpp
#include <iostream>
//generic case
template <typename T>
struct Dump {
Dump(const T& d) {
std::cout << "Generic case:" << d << std::endl;
}
};
// forward declarations
// specializations
template <> struct Dump<std::string> {
Dump(const std::string&s);
};
// string_dump.cpp || all_special_dumps.cpp
#include "dump.hpp"
#include <string>
Dump<std::string>::Dump(const std::string& d) {
std::cout << "String case:" << d << std::endl;
}
// main.cpp
#include "dump.hpp"
int main(int argc, char* argv[]){
Dump<int>(43);
Dump<std::string>("42");
return 0;
}
Из плюсов такого подхода:
- код специализаций сокрыт
- код специализаций содержится в библиотеке а не в каждом её клиенте