extern template , template. :
useful.hxx:
#ifndef USEFUL_HXX
#define USEFUL_HXX
namespace my
{
template <typename T>
T
do_useful_stuff(T x)
{
return x;
}
extern template int do_useful_stuff(int);
extern template float do_useful_stuff(float);
}
#endif
useful.cxx:
#include "useful.hxx"
namespace my
{
template int do_useful_stuff(int);
template float do_useful_stuff(float);
}
, , main.cxx:
#include <iostream>
#include "useful.hxx"
int
main()
{
std::cout << my::do_useful_stuff(42) << std::endl;
std::cout << my::do_useful_stuff(1.0f) << std::endl;
}
useful.cxx main.cxx, .
. , , . , useful.txx
#ifndef MY_EXTERN
#error "Please '#define MY_EXTERN' to 'extern' or '' before '#include'ing this file."
#endif
namespace my
{
MY_EXTERN template int do_useful_stuff(int);
MY_EXTERN template float do_useful_stuff(float);
}
#include useful.cxx
#include "useful.hxx"
#define MY_EXTERN
#include "useful.txx"
#undef MY_EXTERN
useful.hxx
#ifndef USEFUL_HXX
#define USEFUL_HXX
#ifndef MY_USE_EXTERN_TEMPLATES
#define MY_USE_EXTERN_TEMPLATES 0
#endif
namespace my
{
template <typename T>
T
do_useful_stuff(T x)
{
return x;
}
}
#if MY_USE_EXTERN_TEMPLATES
#define MY_EXTERN extern
#include "useful.txx"
#undef MY_EXTERN
#endif
#endif
. , extern , . main.cxx:
#define MY_USE_EXTERN_TEMPLATES 1
#include <iostream>
#include "useful.hxx"
int
main()
{
std::cout << my::do_useful_stuff(42) << std::endl;
std::cout << my::do_useful_stuff(1.0f) << std::endl;
}
useful.cxx main.cxx . #define MY_USE_EXTERN_TEMPLATES 1 main.cxx, .