gpt4 book ai didi

c++ - 如何修复此类模板

转载 作者:行者123 更新时间:2023-11-30 01:42:02 26 4
gpt4 key购买 nike

我正在尝试编写一个类,在最简单的示例中,它的工作方式如下:

// Example program
#include <iostream>
#include <complex>
#include <typeinfo>

template<typename NumberType>
class SomeClass
{
public:
SomeClass(NumberType a_) : a(a_) {}
void get_number()
{
if (typeid(NumberType) == typeid(std::complex<double>))
std::cout << a.real() << " " << a.imag() << std::endl;
else
std::cout << a << std::endl;
}
private:
NumberType a;
};

int main()
{
int a=1;
std::complex<double> c(2.0,3);

SomeClass<int> A(a);
A.get_number();

SomeClass<std::complex<double>> C(c);
C.get_number();

return 0;
}

它基本上按原样打印任何实数,但它应该将复数分成两个实数。

如果我按照显示的那样编译,错误信息如下

 In instantiation of 'void SomeClass<NumberType>::get_number() [with NumberType = int]':
28:18: required from here
14:46: error: request for member 'imag' in '((SomeClass<int>*)this)->SomeClass<int>::a', which is of non-class type 'int'
14:27: error: request for member 'real' in '((SomeClass<int>*)this)->SomeClass<int>::a', which is of non-class type 'int'

我明白因为 a 在第一种情况下是 int 类型,我不能在它上面使用 imag() ,因此错误信息。

如何修改此类,使其在任意 NumberType 模板参数的情况下执行我需要的操作?

最佳答案

您应该使用模板和模板特化,而不是 typeid —在 C++ 中,您希望使用编译时抽象,而不是对变量或值的类型做出运行时决定。

您可以拥有以下独立的辅助函数:

// General case:
template <typename T>
void get_number(const T& value)
{
std::cout << value << std::endl;
}

// Specialization for complex<double>
template <>
void get_number<std::complex<double> >(const std::complex<double>& value)
{
std::cout << value.real() << " " << value.imag() << std::endl;
}

// ... More specializations if you need to.

现在你可以调用:

get_number(3);
get_number(std::complex<double>(1, 2));

为了让它更通用,你可以使用std::complex<T>而不是 std::complex<double> .这需要做更多的工作,因为不支持函数模板偏特化。您需要使 get_number 成为辅助结构的静态成员,如下所示:

// General case:
template <typename T>
struct get_number_helper {
static void get(const T& value)
{
std::cout << value << std::endl;
}
};

// Specialization for complex<T>
template <typename T>
struct get_number_helper<std::complex<T> > {
static void get(const std::complex<T>& value)
{
std::cout << value.real() << " " << value.imag() << std::endl;
}
};

template<typename T>
void get_number(const T& value)
{
get_number_helper<T>::get(value);
}

关于c++ - 如何修复此类模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40266925/

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