我想专门研究以下成员函数:
class foo {
template<typename T>
T get() const;
};
还要依赖于模板的其他课程bar
。
例如,我希望bar
为std::pair
,其中包含一些模板参数,如下所示:
template<>
std::pair<T1,T2> foo::get() const
{
T1 x=...;
T2 y=...;
return std::pair<T1,T2>(x,y);
}
T1和T2也是模板。如何才能做到这一点?据我所知,它应该是 可能的。
现在我可以致电:
some_foo.get<std::pair<int,double> >();
完整/最终答案:
template<typename T> struct traits;
class foo {
template<typename T>
T get() const
{
return traits<T>::get(*this);
}
};
template<typename T>
struct traits {
static T get(foo &f)
{
return f.get<T>();
}
};
template<typename T1,typename T2>
struct traits<std::pair<T1,T2> > {
static std::pair<T1,T2> get(foo &f)
{
T1 x=...;
T2 y=...;
return std::make_pair(x,y);
}
};
答案 0 :(得分:8)
你不能部分专门化功能模板,对不起,但这些是规则。你可以这样做:
class foo {
...
};
template<typename T>
struct getter {
static T get(const foo& some_foo);
};
template<typename T1, typename T2>
struct getter< std::pair<T1, T2> > {
static std::pair<T1, T2> get(const foo& some_foo) {
T1 t1 = ...;
T2 t2 = ...;
return std::make_pair(t1, t2);
};
然后将其称为
getter<std::pair<int, double> >::get(some_foo);
虽然。如果friend
确实需要成为成员函数,您可能需要对get
发货或可见性进行一些处理。
详细说明sbi的建议:
class foo {
...
template<typename T>
T get() const;
};
template<typename T>
T foo::get() const
{
return getter<T>::get(*this);
/* ^-- specialization happens here */
}
现在你又回来了
std::pair<int,double> p = some_foo.get<std::pair<int, double> >();
答案 1 :(得分:1)
你需要重载你的成员函数,比如
template <T, V> std::pair<T, V> foo::get()
在一般情况下,您需要能够消除各种重载之间的歧义。在这种情况下,消歧很容易,因为对是2个类型的模板,而原始成员仅在T模板化。
如果您需要专门化,例如,std :: vector,对于具有单个参数模板的容器,您必须要小心,因为如果您希望实例化,编译器可能会感到困惑模板专业化,其中模板T是std :: vector或重载的专门化,
template <T> std::<vector <T> foo::get() const
由于您完全专注于成员函数
,因此您提出的语法无效 template <>
,
但你遗漏了两种未指明的类型,T1和T2。