gpt4 book ai didi

c++ - 打印出未知类型变量的值?

转载 作者:行者123 更新时间:2023-11-30 00:48:02 24 4
gpt4 key购买 nike

我正在尝试用 C++ 编写一个简单的函数模板,我在其中打印出未知类型变量的值。问题是我不知道该怎么做,因为变量可以是指针或原始类型。使用原始类型,我可以简单地将值打印出来;但指针需要取消引用。

下面的代码给我一个错误:

#include <iostream>
#include <type_traits>

using namespace std;

template<typename T>
void foo(T someVar) {
if(std::is_fundamental<T>::value) {
cout << "It's primitive! \n" << someVar << endl;
} else {
cout << "It's a pointer! \n" << *someVar << endl;
}
}

int main(int argc, char **argv) {
int x = 5;
foo(x);

int *y = new int();
*y = 5;

foo(y);
delete y;

return 0;
}

编译时出现的错误是:

test.cc: In function 'void foo(T) [with T = int]':
test.cc:19:8: instantiated from here
test.cc:13:5: error: invalid type argument of unary '*' (have 'int')

它在提示我试图从我第一次调用 foo() 时取消对原始类型的引用,但这正是我使用 if 语句的原因:检查它是否是原始类型。我将如何着手实现我想做的事情?

最佳答案

您需要做的是编写两个版本的模板函数。

template<typename T>
void foo(T someVar) {
cout << "Assume it's primitive! \n" << someVar << endl;
}

template<typename T>
void foo(T* pVar) {
cout << "This is a pointer! \n" << *pVar << endl;
}

编译器会选择指针版本,因为它更具体。如果类型不是(原始)指针,它将默认为第一个版本。

如果您需要取消引用智能指针,您可以进一步重载您的函数定义。

例如。

template<typename T>
void foo(std::shared_ptr<T> pVar) {
cout << "This is a shared pointer! \n" << *pVar << endl;
}

关于c++ - 打印出未知类型变量的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33049594/

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