首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >忽略c++中自定义类型的“长”说明符

忽略c++中自定义类型的“长”说明符
EN

Stack Overflow用户
提问于 2021-12-09 11:36:46
回答 1查看 40关注 0票数 0

我有一个类型和一个模板类

代码语言:javascript
复制
#ifdef USE_QUAD
using hybrid = __float128;
#else
using hybrid = double;
#endif

template<typename T>
struct Time {
    int day;
    long T dayFraction; // This is an example, I need both in here, T and long T;
};

让事情变得复杂:一个嵌套类

代码语言:javascript
复制
template<typename T>
struct State {
    Time<T> time;
    std::vector<T> position;
}

现在,我希望将代码中的类同时作为hybriddouble使用,如

代码语言:javascript
复制
State<hybrid> stateH; // sometimes precision needed
State<double> stateD; // precision never needed

让预处理器来处理混合动力应该是什么。

然而,由于Time类中的hybrid = double,代码完美地编译了if hybrid = __float128,但没有编译多少,如果是hybrid = __float128的话。

是否有解决办法来定义别名,如

代码语言:javascript
复制
using long __float128 = float128;

在定义longHybrid时,我有了一个解决办法,比如:

代码语言:javascript
复制
#ifdef USE_QUAD
using hybrid     = __float128;
using longHybrid = __float128;
#else
using hybrid     = double;
using longHybrid = long double;
#endif

但是转发两个模板参数会影响一些代码,并且感觉有些多余。我很想听听你的想法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-10 02:31:43

long Tdouble时,您不能实际编写T并期望它被解释为double。如果它适用于您,这是您的编译器的一个不可移植的怪癖。

如果您想要一种类型的“常规”和“长”版本,对于double不同,但对于float128相同,一种方法是定义如下模板:

代码语言:javascript
复制
template <typename T> struct Longer {
    using type = T;
};
template <> struct Longer<double> {
    using type = long double;
};

使用long T代替struct Time中的typename Longer<T>::type

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70289221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档