以下代码演示了问题:
template<typename T>
struct A {
// few members and methods...
};
template<typename T>
struct A<T*> {
// different members and methods
};
A<int> ai; // invokes A<T>
A<int*> ap; // invokes A<T*>
A<shared_ptr<int>> as; // oops ! invokes A<T>
A
专门用于指针类型。现在在某些地方,我使用智能指针(比如shared_ptr
),这会导致问题,如示例所示。
一种方法是复制完整struct A<T*>
并重写struct A<shared_ptr<T>>
。是否有任何优雅方式为A<T*>
调用shared_ptr<>
类型?
我希望采用以下方法:
template<typename T>
struct A<shared_ptr<T>> : public A<T*> { /* empty */ };
这种方法有问题吗?
[以下使用类型会出现唯一的潜在问题:
struct A<T*> {
T* p; // for A<int*> ... "typeof(p) = int*"
};
struct A<share_ptr<T>> : A<T*> {
// oops! the "typeof(p)" is still "int*" and not "shared_ptr<int>"
};
假设,截至目前这不是一个问题。]
答案 0 :(得分:6)
使用提升功能,您可以使用has_dereference
type trait和MPL if_
:
template<typename T>
struct Aobj { /* T is not a pointer */ };
template<typename T>
struct Aptr { /* T is a pointer-like type */ };
template<typename T>
struct A : public
boost::if_<boost::has_dereference<T>, Aptr<T>, Aobj<T> >::type
{ /* implementation provided by base */ };