我正在使用外部库从数据存储对象写入二进制数据,该数据存储对象是从模板构造的。这是一个普遍的问题,所以我不会在这里提到图书馆。模板是显式实例化的,因此它们只能是float
或double
类型。我用自己的方法将调用包装到库编写器,需要决定从库编写器请求的精度。当然,这取决于正在使用的类的版本。我不能使用这样的条件:
typedef std::conditional<std::is_same<T, float>::value, MACRO_FLOAT_TYPE, MACRO_DOUBLE_TYPE>::type T1;
因为我不想定义一个类型我只想在下面的例子中定义precisionType
的值:
template <typename T>
class Data
{
// My class which can either contain data as float or double precision
// My wrapper for the library writing method which takes a custom typedef
void writeData(customType precisionType);
}
int main()
{
// Assume I need two different versions of the data store
Data<float> * dFloat = new Data<float>();
Data<double> * dDouble = new Data<double>();
// I have to call
dFloat->writeData(MACRO_TYPE_FLOAT);
dDouble->writeData(MACRO_TYPE_DOUBLE);
}
但是,我想隐藏用户的这个宏参数,因为它取决于所使用的库,将来可能会有所不同。
我想使precisionType
成为在扩展模板时在编译时选择的类的私有常量成员。然后,用户可以只调用->writeData()
而不用担心精度类型参数。我怎样才能做到这一点?
答案 0 :(得分:1)
遇到this answer并从@NathanOliver获得一些提示后,我意识到可以使用std::is_same()
来解决问题。在customType
类中创建Data
的私有const成员,并通过初始化列表进行分配,然后在writeData()
内使用它,而不必使用任何参数。
template <typename T>
class Data
{
// My class which can either contain data as float or double precision
const customType dataType;
Data() : dataType(std::is_same<T, float>::value ? MACRO_TYPE_FLOAT : MACRO_TYPE_DOUBLE) {};
// My wrapper for the library writing method
void writeData() { // uses dataType internally };
}
int main()
{
// Assume I need two different versions of the data store
Data<float> * dFloat = new Data<float>();
Data<double> * dDouble = new Data<double>();
// I have to call
dFloat->writeData();
dDouble->writeData();
}
答案 1 :(得分:0)
也许我误解了你的问题,也许自从我编写任何C ++以来已经太长了,但为什么你不能在你的方法中使用Xamarin.Android
你的班级声明的签名?
T
然后将其实例化为template <typename T>
class Data
{
writeData(T precisionType);
}
会强制Data<float> * dFloat = new Data<float>();
仅接受dFloat->writeData(floatVal);
类型的变量。