【发布时间】:2016-04-14 19:59:48
【问题描述】:
我正在为嵌入式设备开发应用程序,因此我没有type_traits 和enable_if(编译器质量差)。我自己创建了它们:
template <typename T>
struct is_pointer_t{
enum{value = false};
};
template <typename T>
struct is_pointer_t<T*>{
enum{value = true};
};
以及consts 和volatiles 的类似声明。
现在实现enable_if:
template <bool boolean, typename T = void>
struct enable_if{};
template <typename T>
struct enable_if<true, T>{
typedef T type;
};
现在我想要一个类,取决于我是否使用指针或普通类型,它是否在它们上调用析构函数,所以如果我可以有模板化析构函数会很棒。但是我不知道该怎么做,因为我刚刚开始不了解模板编程。以下尝试失败:
template <typename T>
class pointerOrNot{
public:
template <typename U>
void one();
};
template <typename T>
template <typename enable_if<is_pointer_t<T>::value>::type>
void pointerOrNot<T>::one(){
std::cout << "Success1" << std::endl;
}
template <typename T>
template <typename enable_if<!is_pointer_t<T>::value>::type>
void pointerOrNot<T>::one(){
std::cout << "Success2" << std::endl;
}
它说它与定义不匹配。所以我尝试了以下操作:
template <typename T>
class pointerOrNot{
public:
template <typename enable_if<is_pointer_t<T>::value>::type>
void one();
template <typename enable_if<!is_pointer_t<T>::value>::type>
void one();
};
但是 one() 之一的模板类型为空,编译失败。我怎样才能做到这一点?也可以用析构函数来做到这一点吗?
【问题讨论】:
-
由于所有权问题,我根本不会接受任何原始指针,而不是选择销毁策略。您仍然可以使用包装在智能指针对象中的原始指针,无论是否进行销毁,作为客户端代码选择。定义智能指针并不难,这是完全分离关注点的一种好方法。
-
如果你真的想选择指针类型还是非指针类型,那么你可以使用专门用于 is 和 is-not 的辅助函数模板。您还可以使用所谓的“基于策略的设计”,它本质上是关于将模板 P 作为模板参数,其中 P 由例如实例化。您的 T 并提供例如销毁操作。但是您可以通过智能指针获得更简单、更清晰的关注点分离。
-
在我的拙见中,比
enable_if更具可读性的替代品,我称之为If_,请参阅(github.com/alf-p-steinbach/cppx/blob/plutonium/…)。
标签: c++ templates destructor