Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有不同单位变量的预防算法 我们有C++例程,其中有度量单位和度量单位。由于外部数据格式,将所有数据转换为单个测量系统是不现实的。在方程式中混合单位而不进行转换会导致难以发现的错误。我可以使用typedef创建英制或公制数据类型,但这并不妨碍混合使用。我可以在变量名中添加后缀“I”或“M”,使单位更明显,但这也不能防止混合使用。有人能建议一种方法来指定变量使用的单位,这样编译器(或静态分析工具)就可以标记混合使用了吗_C++ - Fatal编程技术网

具有不同单位变量的预防算法 我们有C++例程,其中有度量单位和度量单位。由于外部数据格式,将所有数据转换为单个测量系统是不现实的。在方程式中混合单位而不进行转换会导致难以发现的错误。我可以使用typedef创建英制或公制数据类型,但这并不妨碍混合使用。我可以在变量名中添加后缀“I”或“M”,使单位更明显,但这也不能防止混合使用。有人能建议一种方法来指定变量使用的单位,这样编译器(或静态分析工具)就可以标记混合使用了吗

具有不同单位变量的预防算法 我们有C++例程,其中有度量单位和度量单位。由于外部数据格式,将所有数据转换为单个测量系统是不现实的。在方程式中混合单位而不进行转换会导致难以发现的错误。我可以使用typedef创建英制或公制数据类型,但这并不妨碍混合使用。我可以在变量名中添加后缀“I”或“M”,使单位更明显,但这也不能防止混合使用。有人能建议一种方法来指定变量使用的单位,这样编译器(或静态分析工具)就可以标记混合使用了吗,c++,C++,对于初学者,对于这种强类型,您可以为每个单元定义不同的类型,然后通过使用不同方程式的模板版本强制执行混合规则。沿着这条可延伸的路线: template <typename T> struct Imperial { T value; }; template <typename T> struct Metric { T value; }; template <typename U> void SomeEquation(U lhs, U rhs)

对于初学者,对于这种强类型,您可以为每个单元定义不同的类型,然后通过使用不同方程式的模板版本强制执行混合规则。沿着这条可延伸的路线:

template <typename T>
struct Imperial
{
    T value;
};

template <typename T>
struct Metric
{
    T value;
};

template <typename U>
void SomeEquation(U lhs, U rhs)
{
    // Equation logic
}

int main()
{
    Imperial<double> feet{3.28084};
    Metric<double> meters{1.0};

    SomeEquation(feet, feet);      // OK
    SomeEquation(meters, meters);  // OK
    //SomeEquation(feet, meters);    // Compilation error

    return 0;
}
您可以使用它。

您需要的是“强类型”,即围绕基本类型(
int
double
或甚至是
std::string
)的模板包装器,使英制和公制类型不同。使用不同的类型会使编译器抱怨非法的赋值和操作

在这里可以找到一种在所有后台实现强类型的方法:


你可以更进一步,实现方便的算术运算符。

对于不同的单位使用不同的类型如何?你可以看看,或者标准的解决方案是对不同的单位使用不同类型的强typedef。这里面写满了用户定义的文字。@Bathsheba头脑发昏,第一次我是:oThanks所有人。正是我想要的信息。非常感谢。
template <typename T>
void SomeEquation(Metric<T> lhs, Metric<T> rhs)
{
    // Specialized equation logic for metric types
}
Imperial<long double> operator"" _foot(long double value)
{
    return Imperial<long double>{value};
}

Metric<long double> operator"" _meter(long double value)
{
    return Metric<long double>{value};
} 
int main()
{
    auto feet = 3.28084_foot;
    auto meters = 1.0_meter;

    SomeEquation(feet, feet);      // OK
    SomeEquation(meters, meters);  // OK
    //SomeEquation(feet, meters);    // Compilation error

    return 0;
}