【发布时间】:2019-04-06 20:04:22
【问题描述】:
我正在尝试编写一个类模板,该模板根据MAX_SIZE 模板参数选择存储成员变量 raw 或作为指针。
当我尝试使用足够大的MAX_SIZE 实例化它以选择原始时,编译器仍会尝试编译我将值分配为指针的行并触发不可能的转换错误 - 即使它可能会优化这条线在某个时候。
template <int MAX_SIZE = sizeof(void*)>
class WeakVar {
typedef typename std::conditional<sizeof(long double) <= MAX_SIZE, long double, long double*>::type TypeLD;
TypeLD ld_;
public:
WeakVar() {
if(std::is_pointer<TypeLD>::value)
ld_ = new long double(0); // error: cannot convert 'long double*' to 'TypeLD'{aka 'long double'}
else
ld_ = 0;
}
//...
};
该类旨在成为节省空间的“弱类型变量”(不一定是速度高效的,它不意味着经常被调用)。 'ld_' 成员实际上是联合的一部分(以及 char、int、bool、float 等...)。
我尝试使用std::enable_if 制作二传手,但无济于事...
//...
WeakVar() { setLD(0); }
typename std::enable_if<std::is_pointer<TypeLD>::value>::type setLD(long double value) {
ld_ = new long double(value);
}
typename std::enable_if<!std::is_pointer<TypeLD>::value>::type setLD(long double value) {
ld_ = value;
}
// error: the second method cannot be overloaded with the first
//...
有没有办法做到这一点? (同时保留选择班级MAX_SIZE的可能性)
【问题讨论】:
标签: c++ c++11 templates template-meta-programming sfinae