2010-02-08 44 views
2

是否有可能专注于一些(不是全部)类模板参数?是否可以专注于一些(不是全部)类模板参数?

例如:

template <typename T, typename U> 
class TC 
{ 
public: 
void Foo(); 
}; 

template <typename T, typename U> 
void TC<T, U>::Foo() 
{ 

} 

template <???, typename U> 
void TC<int, U>::Foo() 
{ 
    //Want this defined for all U but only when T is int. 
} 

int main(int argv, char * args []) 
{ 
TC<int, char> tc; 
return 0; 
} 

回答

3

一般来说,你可以专注只是一个类模板的一些模板参数,这就是所谓的“局部特殊化”。当你这样做时,你会创建一个新的专用版本的模板来“覆盖”通用版本。

就你而言,你似乎只想要专门化模板的一部分,即Foo()方法,但这是不可能的。你有专攻整个TC类:

// specialization for T=int 
template <typename U> 
class TC<int, U> { 
public: 
    void Foo(); 
}; 

// implementation of Foo() for the specialized template 
template <typename U> 
void TC<int, U>::Foo() 
{ 
    //Want this defined for all U but only when T is int. 
} 
0

如果你希望只专注类的一部分,你需要的原班提供挂钩。根据实施情况,它通常描述为TraitsPolicies

A Traits类是一种为给定类型引用某些属性(有时是方法)并且不会显式传递的类。 STL中的一个例子是std::iterator_traits<It>

A Policy class是作为模板参数传递的类,用于实现许多功能。 STL中的一个例子是std::less<int> in std::set<int, std::less<int> >

一般而言,使用Policy类是明确的,而使用Traits是隐含的...因此我更喜欢前者到后者。

如果你的类不使用这些挂钩,然后sth答案报告部分专业化,并注意部分意味着一些参数仍然模板,不是说你想专门类的一部分,因为你必须重新定义一切。

1

对于课程,是的。对于功能,不,是的。

模板偏特是罚款班,但对全局函数这是一个有点更靠谱。

对于类,你简单地忽略专业化参数从模板参数列表,包括它的类定义:

// General template class for a vector 
template <class T, int N> 
struct Vector 
{ 
    T e[N]; 
}; 

// Specialization for N=3 
template <class T> // omit the N 
struct Vector<T, 3> // and include it here 
{ 
    T e[3]; 

    static Vector<T, 3> cross(const Vector<T, 3>& a, const Vector<T, 3>& b) 
    { 
    return Vector<T, 3>(a.e[1] * b.e[2] - a.e[2] * b.e[1], 
         a.e[2] * b.e[0] - a.e[0] * b.e[2], 
         a.e[0] * b.e[1] - a.e[1] * b.e[0]); 

    } 
}; 

对于全局的功能,你不能这样做。你可以定义一个完全一般的或完全专用的函数 - 不允许部分函数的特化。

但是,可以部分通过创建它作为一个专门的部分类的静态功能的代理专业化的功能。

例如

template <class A, class B> 
void foo(A a, B b) 
{ 
    foo_impl::fun(a, b); 
} 

template <class A, class B> 
struct foo_impl 
{ 
    static void fun(A a, B b) 
    { 
    // real implementation here 
    } 
}; 

然后,您可以专注于你想要的任何方式foo_impl,这将在foo反映。

相关问题