gpt4 book ai didi

c++ - 如何从模板函数返回模板类?

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

我如何完成可以编译最后注释行的内容?我将如何更改此代码以使其工作?

#include<iostream>

using namespace std;

template <int x>
class someclass{
public:
int size;
int intarr[x];
someclass():size(x){}
};

template<int x, int y>
int somefunc(someclass<x> A, someclass<y> B){
return ( A.size > B.size ? A.size : B.size);
}

template<int x, int y, int z>
someclass<x> anotherfunc(someclass<y> A, someclass<z> B){
return ( A.size > B.size ? A : B);
}

int main(){

someclass<5> A;
someclass<10> B;
cout << "SIZE = " << somefunc(A,B) << endl;
//cout << "SIZE = " << (anotherfunc(A,B)).size << endl; //THIS DOES NOT COMPILE
return 0;
}

最佳答案

如何从函数外部知道 x 是什么? (它不能查看函数体,因为在 哪个 中它查看哪个函数的函数体取决于 x 得到什么值!)。你也不能写 ?: 因为你的两个分支都产生完全不相关的类型,这些类型不可能成为通用类型。但是该运算符需要对其求值的两个分支具有通用类型。

然后您遇到的另一个问题是 size 不是编译时间常量,另一篇文章已经详细说明了。

我认为这应该可行:

template<int y, int z>
someclass<sizeof (char[+(y >= z)]) * y> anotherfunc(someclass<y> A, someclass<z> B){
return A;
}

template<int y, int z>
someclass<sizeof (char[+(y < z)]) * z> anotherfunc(someclass<y> A, someclass<z> B){
return B;
}

现在调用时,yz由参数推导,然后将参数代入返回类型。 sizeof(char[1 or 0]) 将测试 yz 是否更大。在将其计算为 sizeof(char[1])(结果为 1)的相应模板中,我们将乘以更大(或等于)的值。如果相应的模板产生 sizeof(char[0]),这是一个推导失败(数组不能为零大小!)并且模板不会被重载决议选择(称为SFINAE)。

一元 + 产生 10 作为 int 而不是 truefalse,这可能会导致某些编译器出现编译器警告。


enable_if 还有一种“干净”的方式。它不是在使用可怕的 sizeof 技巧,而是使用一般已建立的 enable_if 模式。 Boost 有它的实现

template<int y, int z>
typename boost::enable_if_c<(y >= z), someclass<y> >::type
anotherfunc(someclass<y> A, someclass<z> B){
return A;
}

template<int y, int z>
typename boost::enable_if_c<(y < z), someclass<z> >::type
anotherfunc(someclass<y> A, someclass<z> B){
return B;
}

乍一看这可能看起来更嘈杂,但对于那些已经习惯于enable_if(boost实现接受普通 bool 值,如上所述)。

关于c++ - 如何从模板函数返回模板类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2907580/

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