Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 根据参数数量从函数返回结构对象,并将其分配给常规结构的对象_C++_Templates_Struct - Fatal编程技术网

C++ 根据参数数量从函数返回结构对象,并将其分配给常规结构的对象

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

我试着解释一下。 我需要一个函数,它可以获取不同数量的参数(2,3或更多),并根据它返回相应的struct对象:

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
    }