根据模板参数选择宏定义

时间:2017-07-27 14:23:22

标签: c++ templates macros

我正在使用外部库从数据存储对象写入二进制数据,该数据存储对象是从模板构造的。这是一个普遍的问题,所以我不会在这里提到图书馆。模板是显式实例化的,因此它们只能是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成为在扩展模板时在编译时选择的类的私有常量成员。然后,用户可以只调用->writeData()而不用担心精度类型参数。我怎样才能做到这一点?

2 个答案:

答案 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);类型的变量。