gpt4 book ai didi

c++ - 模板类实例之间的类型转换

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

我目前正在试验 c++ 风格的类型转换。为此,我创建了一个模板类 pClass ,它接受一些 T 类型的元素并打印它。

现在我(例如)想转换一个 pClass<char> 类型的实例至 pClass<int> .但是,非我的类型转换尝试似乎按预期工作。

我已经发现 dynamic_cast用于在运行时和处理虚函数/多态类时进行转换,这里不是这样。 static_cast 用于编译时的转换。所以,就我而言 static_cast我认为应该是正确的选择?

此处关于 stackoverflow 的一些主题有类似的问题,但仅在处理多个类且它们之间存在一些继承时。不幸的是,我无法真正将它们与我的问题联系起来(例如 C++ Casting between template invocations )。

#include <iostream>

template <typename T>
class pClass {
public:
T value;
pClass(T value) {
this->value = value;
std::cout << value << std::endl;
}
virtual ~pClass() {}
};

int main() {
pClass<int> pInt(5);
pClass<char> pChar('a');
pClass<float> pFloat(4.2f);

// pClass<int> pInt2 = static_cast<pClass<int>&>(pChar); // gives invalid type conversation
// pClass<int>& pInt3 = dynamic_cast<pClass<int>&>(pChar); // warning: dynamic_cast of ‘pClass<char> pChar’ to ‘class pClass<int>&’ can never succeed
// pClass<int> pInt4 = reinterpret_cast<pClass<int>&>(pChar); // works, but does not print anything
// std::cout << pInt2.value << std::endl; // prints 3277 or even 327777 exept of 97, which is the expected ASCII representation
}

对于每次转换尝试,我都在命令后面写下了错误消息/结果输出。我很感激任何可以帮助我在这里找到正确类型的转换的提示。

非常感谢!

最佳答案

尽管类型来自同一个模板,但它们完全无关。你不能只在它们之间进行转换,编译器怎么知道你所说的转换是什么意思?由于模板特化,pClass<char>甚至可能不包含 char可以转换为 int .

解决方案是使用cast 转换运算符编写casting 的含义:

template <typename T>
class pClass {
public:
T value;
pClass(T value) {
this->value = value;
std::cout << value << std::endl;
}
virtual ~pClass() {}

template<typename U>
operator pClass<U>(){
return pClass<U>(static_cast<U>(this->value));
}
};

上述方法允许在任意两个 pClass<T> 之间进行转换和 pClass<U>通过转换存储值的对象。这将使以下代码编译:

pClass<int> pInt{1};
pClass<float> pfloat{pInt};

第二行调用拷贝构造函数的地方pClass<float>::pClass<float>(const pClass<float>&);它使用隐式转换来转换 pIntpClass<float>类型。

我建议明确转换运算符:

template<typename U> explicit operator pClass<U>()

这将禁止上面的隐式转换但仍然允许显式转换:

pClass<float> pfloat{static_cast<pClass<float>>(pInt)};

关于c++ - 模板类实例之间的类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56609840/

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