如果我的模板类具有重载的模板成员函数(使用SFINAE),例如:
template <typename T>
struct Foo{
Foo(T elem);
template <typename U = T>
auto get() -> std::enable_if_t<std::is_same_v<U, int>, U>;
template <typename U = T>
auto get() -> std::enable_if_t<std::is_same_v<U, bool>, U>;
T elem_;
};
现在在我的CPP文件中,我必须定义并显式实例化:
template class Foo<int>;
template int Foo<int>::get<int>();
template class Foo<bool>;
template bool Foo<bool>::get<bool>();
// For all types...T, there will be two statements.
按类型进行分组实例化的可能方法有哪些-类似于:
GroupedFooInit<int>(); // does both Foo<int> and Foo<int>::get<int>
GroupedFooInit<bool>(); // similar
.. and so on.
鉴于我注定要使用C ++ 14,我可以想出2种解决方法,但不想要/喜欢:
1. Macros
:可能,但强烈希望避免。
2. Definition in header, no explicit instantiation needed
:可能,但是我正在处理一个巨大的仓库,其中我要处理的文件几乎随处可见-因此,即使我进行细微的改动,我的构建时间也很长。
答案 0 :(得分:2)
您可以通过添加一个层来解决问题:
template <typename T>
struct Foo{
Foo(T elem);
T elem_;
T get(){
return do_get<T>();
}
private:
template <typename U = T>
auto do_get() -> std::enable_if_t<std::is_same<U, int>::value, U>;
template <typename U = T>
auto do_get() -> std::enable_if_t<std::is_same<U, bool>::value, U>;
};
//If definitions for the do_get functions are provided before these
//explicit template instantiation definitions, the compiler will certainly
//inline those definitions.
template class Foo<int>;
template class Foo<bool>;