Краткая справка: я пишу интеллектуальный указатель на основе политики (например, SmartPtr в библиотеке Loki), который может иметь разрушительную семантику копирования, такую как 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!
}