gpt4 book ai didi

c++ - 根据模板参数选择宏定义

转载 作者:行者123 更新时间:2023-11-28 05:03:32 25 4
gpt4 key购买 nike

我正在使用外部库从根据模板构建的数据存储对象写入二进制数据。这是一个普遍的问题,所以我不会在这里提到图书馆。模板是显式实例化的,因此它们只能是 floatdouble 类型。我用自己的方法包装了对库编写器的调用,该方法需要决定向库编写器请求的精度。当然,这取决于正在使用的类的版本。我不能使用这样的条件:

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 成为在编译时扩展模板时选择的类的私有(private)常量成员。然后用户只需调用 ->writeData() 而不必担心精度类型参数。我怎样才能做到这一点?

最佳答案

遇到了this answer在@NathanOliver 的一些提示下,我意识到 std::is_same() 可以用来解决这个问题。在 Data 类中创建 customType 的私有(private) 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();
}

关于c++ - 根据模板参数选择宏定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45353608/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com