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 57 58 59 60 61 62 63 64 65 66 67 68 69 70
|
%module template_specialization
%rename(not1) *::operator!() const;
%rename(negate) *::operator-() const;
%warnfilter(SWIGWARN_PARSE_TEMPLATE_FORWARD) vfncs::OnlySpecialized<double>;
%inline %{
namespace vfncs {
template <class ArgType>
struct UnaryFunction
{
UnaryFunction operator-() const { return *this; }
};
template <>
struct UnaryFunction<bool>
{
// This works
// UnaryFunction<bool> operator!() const;
// This doesn't
UnaryFunction operator!() const { return *this; }
// Does this?
void foo(UnaryFunction) { }
};
// Also test specialization with only primary template forward declaration
template <typename T> struct OnlySpecialized;
template <> struct OnlySpecialized<int>
{
void bar(const OnlySpecialized& other) { }
};
}
%}
namespace vfncs {
%template(UnaryFunction_double) UnaryFunction<double>;
%template(UnaryFunction_bool) UnaryFunction<bool>;
// Specialized instantiation with only primary template forward declaration
%template(OnlySpecialized_int) OnlySpecialized<int>;
// Primary instantiation with only primary template forward declaration
%template(OnlySpecialized_double) OnlySpecialized<double>; // ignored with a warning
}
%{
namespace vfncs {
template <typename T> struct OnlySpecialized {
int primary() const { return 0; }
};
}
%}
%inline %{
namespace vfncs {
// Use primary template with only primary template forward declaration (for SWIG, but full declaration seen by compiler)
OnlySpecialized<double> factory(OnlySpecialized<double>* os) {
OnlySpecialized<double> ret = os ? *os : OnlySpecialized<double>();
ret.primary();
return ret;
}
}
%}
|