在 C++ 中忽略自定义类型的 'long' 说明符
Ignore 'long' specifier for custom type in c++
我有类型和模板class
#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;
};
并使事情变得复杂:嵌套 class
template<typename T>
struct State {
Time<T> time;
std::vector<T> position;
}
现在我想在我的代码中同时使用 class 作为 hybrid
和 double
,比如
State<hybrid> stateH; // sometimes precision needed
State<double> stateD; // precision never needed
让预处理器处理混合应该是什么。
然而,代码在 hybrid = double
时可以完美编译,但在 hybrid = __float128
时则不那么完美,因为时间 class 中的 long T dayFraction;
。
是否有解决方法来定义像
这样的别名
using long __float128 = float128;
?
我有一个定义 longHybrid
的解决方法,例如:
#ifdef USE_QUAD
using hybrid = __float128;
using longHybrid = __float128;
#else
using hybrid = double;
using longHybrid = long double;
#endif
但是转发两个模板参数会影响一些代码,感觉有点多余。
我很想听听任何想法。
当 T
为 double
时,您不能实际编写 long T
并期望将其解释为 long double
。如果它对你有用,那是你的编译器的一个不可移植的怪癖。
如果您想要一种类型的“常规”和“长”版本,double
不同但 float128
相同,一种方法是定义这样的模板:
template <typename T> struct Longer {
using type = T;
};
template <> struct Longer<double> {
using type = long double;
};
而不是 struct Time
中的 long T
,使用 typename Longer<T>::type
。
我有类型和模板class
#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;
};
并使事情变得复杂:嵌套 class
template<typename T>
struct State {
Time<T> time;
std::vector<T> position;
}
现在我想在我的代码中同时使用 class 作为 hybrid
和 double
,比如
State<hybrid> stateH; // sometimes precision needed
State<double> stateD; // precision never needed
让预处理器处理混合应该是什么。
然而,代码在 hybrid = double
时可以完美编译,但在 hybrid = __float128
时则不那么完美,因为时间 class 中的 long T dayFraction;
。
是否有解决方法来定义像
这样的别名using long __float128 = float128;
?
我有一个定义 longHybrid
的解决方法,例如:
#ifdef USE_QUAD
using hybrid = __float128;
using longHybrid = __float128;
#else
using hybrid = double;
using longHybrid = long double;
#endif
但是转发两个模板参数会影响一些代码,感觉有点多余。 我很想听听任何想法。
当 T
为 double
时,您不能实际编写 long T
并期望将其解释为 long double
。如果它对你有用,那是你的编译器的一个不可移植的怪癖。
如果您想要一种类型的“常规”和“长”版本,double
不同但 float128
相同,一种方法是定义这样的模板:
template <typename T> struct Longer {
using type = T;
};
template <> struct Longer<double> {
using type = long double;
};
而不是 struct Time
中的 long T
,使用 typename Longer<T>::type
。