1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
|
#include "templates.h"
// template methods
long MyTemplatedMethodClass::get_size() { return -1; }
long MyTemplatedMethodClass::get_char_size() { return (long)sizeof(char); }
long MyTemplatedMethodClass::get_int_size() { return (long)sizeof(int); }
long MyTemplatedMethodClass::get_long_size() { return (long)42; /* "lying" */ }
long MyTemplatedMethodClass::get_float_size() { return (long)sizeof(float); }
long MyTemplatedMethodClass::get_double_size() { return (long)sizeof(double); }
long MyTemplatedMethodClass::get_self_size() { return (long)sizeof(MyTemplatedMethodClass); }
// variadic templates
#ifdef WIN32
__declspec(dllexport)
#endif
std::string some_variadic::gTypeName = "";
// template with empty body
namespace T_WithEmptyBody {
#ifdef WIN32
__declspec(dllexport)
#endif
std::string side_effect = "not set";
template<typename T>
void some_empty() {
side_effect = "side effect";
}
template void some_empty<int>();
} // namespace T_WithRValue
// The following is hidden from the Cling interpreter, but available to the
// linker; it allows for testing whether a function return is picked up from
// the compiled instantation or from the interpreter.
namespace FailedTypeDeducer {
template<class T>
class A {
public:
T result() { return T{42}; }
};
template class A<int>;
template class B<int>;
} // namespace FailedTypeDeducer
|