【发布时间】:2011-07-17 00:00:26
【问题描述】:
一些背景知识:我正在编写一个基于策略的智能指针(如 Loki 库中的 SmartPtr),它可能具有破坏性复制语义,如 auto_ptr。因此,它需要有一个模板复制构造函数采用非常量引用来修改被复制的对象。
我正在尝试做的是通过策略中的某个变量参数化复制构造函数所采用的参数的常量,以便在不需要破坏性复制语义时使其变为常量。这是我提出的想法的简化代码,但不幸的是,它不起作用,因为编译器无法推断模板参数。是否有任何其他技术可用于实现所需的行为?
template <typename T, bool isEnabled> struct AddConst {
typedef T Type;
};
template <typename T> struct AddConst<T, true> {
typedef const T Type;
};
struct MyCopyPolicy {
static const bool kIsCopyArgConst = true;
};
template <typename T, class CopyPolicy> struct Foo {
// A helper struct to achieve "template typedef".
template <typename T2> struct CopyArg {
typedef typename AddConst<Foo<T2, CopyPolicy>,
CopyPolicy::kIsCopyArgConst>::Type Type;
};
Foo() {}
// Template copy constructor. Doesn't work.
template <typename T2> Foo(typename CopyArg<T2>::Type& rhs) {}
};
int main() {
Foo<int, MyCopyPolicy> foo1;
Foo<double, MyCopyPolicy> foo2 = foo1; // error!
}
【问题讨论】:
-
你有一个“非推断上下文”的问题,类似于这里 stackoverflow.com/questions/1268504/…>。问题是编译器如果不为 所有 可能的类型实例化 CopyArg 并比较它们的嵌套类型,就无法确定 T2。
标签: c++ templates metaprogramming smart-pointers copy-constructor