模板参数的模板专门化

template specialization for template parameters

本文关键字:专门化 参数      更新时间:2023-10-16

我有两个模板

template<typename Policy>
class X : public Policy
{ }
template<typename T>
class SimplePolicy 
{ }

SimplePolicy可作为X的模板参数。是否有可能将X专门化为所有SimplePolicy -ies的出现(即任何T)?或者如果不可能的话,最好的策略是什么?

谢谢!

是的,你可以这样做:

#include <iostream>
using namespace std;
template<typename T>
class SimplePolicy 
{ };
template<typename Policy>
class X : public Policy
{   
    public: void Do() { cout << "Standard" << endl; }
};  
template<typename Inner>
class X<SimplePolicy<Inner> >
{   
    public: void Do() { cout << "Special" << endl; }
};  
class A{};
int main()
{   
    X<A> xa; 
    X<SimplePolicy<A>> xs; 
    xa.Do();
    xs.Do();
} 

可以使用部分模板专门化

#define STATIC_ASSERT(exp) 
    typedef char static_assert_ ## __LINE__ [(exp) ? 1 : -1]
template<typename Policy>
class X : public Policy
{
public:
    enum { value = 0 };
};
template<typename T>
class SimplePolicy 
{ };
class CleverPolicy 
{ };
template <typename T>
class X< SimplePolicy<T> > : public SimplePolicy<T>
{ 
public:
    enum { value = 1 }; 
};
int _tmain(int argc, _TCHAR* argv[])
{
    STATIC_ASSERT(X<SimplePolicy<int> >::value == 1);
    STATIC_ASSERT(X<SimplePolicy<float> >::value == 1);
    STATIC_ASSERT(X<CleverPolicy>::value == 0);
    return 0;
}