gpt4 book ai didi

c++ - 根据类型比较赋值

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:21:14 26 4
gpt4 key购买 nike

我正在尝试制作一个模板类,根据需要接受 doublempfr::mpreal类型。这就是我想要做的:

x = ( typeid(T)==typeid(double) ? value : value.toDouble() );

但它在编译时提示无法在赋值中将‘const mpfr::mpreal’转换为‘double’。我也试过std::is_same , 有同样的错误。我正在尝试做的事情是被禁止的,还是完全错误的(或两者兼而有之)?有什么办法可以做到这一点?类的调用在每个文件中是不同的,但是是固定的,例如在一个 .cpp 中。它被称为 Class<double> , 在另一个 Class<mpfr::mpreal>等。这是一个快速测试程序:

#include <iostream>
#include <typeinfo>
#include "mpreal.h"

template<class T>
class Bla
{
private:
double a;
public:
Bla(const T &x) { a = (std::is_same<T, double>::value ? x : x.toDouble()); }
void f() { std::cout << "a = " << a << '\n'; }
};

int main()
{
mpfr::mpreal x {1.0};
double y {2.0};
{
Bla<mpfr::mpreal> a {Bla<mpfr::mpreal>(x)};
a.f();
}
{
Bla<double> a {Bla<double>(y)};
a.f();
}

return 0;
}

最佳答案

无论使用哪种类型 T 实例化函数,该函数都必须是正确的。

也就是两者

Bla(const double &x) { a = (std::is_same<double, double>::value ? x : x.toDouble()); }

Bla(const mpfr::mpreal &x) { a = (std::is_same<mpfr::mpreal, double>::value ? x : x.toDouble()); }

必须是正确的,很明显两者都不是 - doublempfr::mpreal 以及 double 之间没有隐式转换没有 toDouble() 成员函数。

一个简单的解决方案是将转换委托(delegate)给重载函数:

double to_double(double x) { return x; }
double to_double(mpfr::mpreal x) { return x.toDouble(); }

Bla(const T &x)
: a(to_double(x))
{
}

关于c++ - 根据类型比较赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43517367/

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