Немного предыстории: я пишу интеллектуальный указатель на основе политики (например, 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!
}