C++ 根据参数数量从函数返回结构对象,并将其分配给常规结构的对象
我试着解释一下。 我需要一个函数,它可以获取不同数量的参数(2,3或更多),并根据它返回相应的struct对象:C++ 根据参数数量从函数返回结构对象,并将其分配给常规结构的对象,c++,templates,struct,C++,Templates,Struct,我试着解释一下。 我需要一个函数,它可以获取不同数量的参数(2,3或更多),并根据它返回相应的struct对象: someStruct funcReturn(bool par1, bool par2, ...) { someStruct temp; if (par1) { //... } if (par2) { //... } ... return temp; } 结构非常简单: struc
someStruct funcReturn(bool par1, bool par2, ...)
{
someStruct temp;
if (par1)
{
//...
}
if (par2)
{
//...
}
...
return temp;
}
结构非常简单:
struct ReturnTwo
{
int one;
int two;
};
struct ReturnThree
{
int one;
int two;
int three;
};
最后,我需要将此函数的结果分配给一个由四个对象组成的通用结构(缺少的元素初始化为0):
我的问题可分为两部分:
ReturnFour returnFour = {funcReturn(true, false).one,funcReturn(true, false).two,0 ,0}
但我认为还有一种更方便的方法。谢谢大家! 重载函数是否适合您
ReturnOne funcReturn(bool par1) { ... }
ReturnTwo funcReturn(bool par1, bool par2) { ... }
等等?另一种可能是返回一个optionals结构,或者返回一组int和flag来表示存在哪些
如果您想让参数的运行时值(而不是参数的数量)来确定函数返回的类型,那么这是不可能的。在这种情况下,您最好使用我上面给出的一个动态建议,因为它必须只返回一个类型,并且您可能希望该类型指示它包含哪些值
最后一个想法是,如果布尔值在编译时已知,则可以使用模板参数而不是函数参数,然后使用不同的专门化,以便真/假值的组合可以选择适当的专门化。只需始终返回一个
ReturnFour
。返回不同的类型-即使它们是ReturnFour
的子集,也意味着您必须编写转换运算符或转换构造函数,这是额外的工作,在本文中没有任何好处
这会使您的重载看起来像
ReturnFour funcReturn(bool p1) { return {42}; }
ReturnFour funcReturn(bool p1, bool p2) { return {42, 53}; }
并且返回结构的未使用成员的值将初始化为零。以下解决方案使用模板、C++17结构化绑定和
std::tuple
返回类型来允许任何数量的参数。例如,将所有转换为int
值的bool
值相加
#include <tuple>
int translate(bool par) // logic to translate a bool to an int
{
if (par) {
return 5;
}
else {
return -3;
}
}
template <typename T>
struct ToInt {
using Type = int;
};
template <typename... Targs>
std::tuple<typename ToInt<Targs>::Type...> funcReturn(Targs... Fargs)
{
return { translate(Fargs)... };
}
int main() {
auto [par1, par2, par3, par4] = funcReturn(true, false, true, true);
int total = par1 + par2 + par3 + par4; // total == 12
}
#包括
int translate(bool par)//将bool转换为int的逻辑
{
如果(标准杆){
返回5;
}
否则{
返回-3;
}
}
模板
结构单元{
使用Type=int;
};
模板
std::tuple funcReturn(targets…Fargs)
{
返回{translate(Fargs)…};
}
int main(){
auto[par1,par2,par3,par4]=funcReturn(真,假,真,真);
int-total=par1+par2+par3+par4;//total==12
}
您似乎试图让函数的返回类型取决于其参数的运行时值。这在C++中是不可能的。函数返回类型必须在编译时已知。您可以有4个重载。。。但是专用构造函数似乎更好。您可以使用
ReturnFour-funcReturn(bool-par1,bool-par2,…)
并为ReturnFour
添加构造函数,该构造函数将ReturnTwo
和ReturnThree
包含在内。谢谢您的提示!ReturnFour的特殊构造是唯一的方法。
#include <tuple>
int translate(bool par) // logic to translate a bool to an int
{
if (par) {
return 5;
}
else {
return -3;
}
}
template <typename T>
struct ToInt {
using Type = int;
};
template <typename... Targs>
std::tuple<typename ToInt<Targs>::Type...> funcReturn(Targs... Fargs)
{
return { translate(Fargs)... };
}
int main() {
auto [par1, par2, par3, par4] = funcReturn(true, false, true, true);
int total = par1 + par2 + par3 + par4; // total == 12
}