gpt4 book ai didi

C++ 模板类和复制构造

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:37:07 24 4
gpt4 key购买 nike

如果两个对象的模板参数在运行时相同,有什么方法可以从给定对象构造新对象?例如:

我有一个带有声明的模板类:

template<typename _Type1, typename _Type2> class Object;

接下来,我有两个模板实例:

template class Object<char, int>;
template class Object<wchar_t, wint_t>;

现在,我想写一个成员函数,例如:

template<typename _Type1, typename _Type2>
Object<char, int> Object<_Type1, _Type2>::toCharObject() {
if(__gnu_cxx::__are_same<_Type1, char>::__value)
return *this;
else {
//Perform some kind of conversion and return an Object<char, int>
}
}

我尝试了一些技术,例如使用 __gnu_cxx::__enable_if<__gnu_cxx::__are_same<_Type1, char>::__value, _Type1>::__typeOject 的复制构造函数中类,但我一直遇到错误:

error: conversion from ‘Object<wchar_t, wint_t>’ to non-scalar type ‘Object<char, int>’ requested

我没有办法做到这一点吗?任何帮助将不胜感激!

最佳答案

你所拥有的应该可以工作,问题是编译器正在对 return *this 进行类型检查部分,即使类型不相等(因此编译错误)。只需使用 return (Object<char, int>)(*this);你应该没问题——唯一一次执行代码的时间是类型相同时,所以除了解决编译错误外,强制转换什么都不做。

或者,您可以使用模板特化:

template <class _Type1, class _Type2>
Object<char, int> toCharObject(Object<_Type1, _Type2> obj)
{
// Do conversion and return
}

// Specialisation when types are equal
template <>
Object<char, int> toCharObject(Object<char, int> obj)
{
return obj;
}

如您所见,这是一个免费功能。您可以将它作为一个成员函数来实现,但它更棘手,因为您不能专门化单个成员函数——您必须专门化整个类。您可以通过分解出非专用代码来解决这个问题,但这确实很丑陋,但效果也一样。

关于C++ 模板类和复制构造,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2575002/

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