LINUX.ORG.RU

История изменений

Исправление 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;
}

Из плюсов такого подхода:

  • код специализаций сокрыт
  • код специализаций содержится в библиотеке а не в каждом её клиенте