Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.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+中的模板函数+;_C++_Function_Templates - Fatal编程技术网

C++ 将结构传递给C+中的模板函数+;

C++ 将结构传递给C+中的模板函数+;,c++,function,templates,C++,Function,Templates,这就是我想要实现的 我想将结构作为参数传递给函数,函数将返回字符指针 每次我都会传递不同的结构作为参数,它有不同的名称和不同类型的成员变量 函数必须标识结构及其成员变量,获取成员变量的值,并将其连接为单个字符串并返回 请建议 我对模板功能和RTTI感到困惑….我想到的第一个建议是:重新设计 如果你真的想像你说的那样做,并且不知道字段的名称,我认为模板对你没有任何好处。我建议使用预处理器: #define UGLY(str, int_field, char_field) whatever_you_

这就是我想要实现的

  • 我想将结构作为参数传递给函数,函数将返回字符指针
  • 每次我都会传递不同的结构作为参数,它有不同的名称和不同类型的成员变量
  • 函数必须标识结构及其成员变量,获取成员变量的值,并将其连接为单个字符串并返回
  • 请建议


    我对模板功能和RTTI感到困惑….

    我想到的第一个建议是:重新设计

    如果你真的想像你说的那样做,并且不知道字段的名称,我认为模板对你没有任何好处。我建议使用预处理器:

    #define UGLY(str, int_field, char_field) whatever_you_want_to_do_with_them
    
    然后你会打电话:

    a some_a;
    b some_b;
    
    UGLY(some_a, x, y);
    UGLY(some_b, b, a);
    

    我想到的第一个建议是:重新设计

    如果你真的想像你说的那样做,并且不知道字段的名称,我认为模板对你没有任何好处。我建议使用预处理器:

    #define UGLY(str, int_field, char_field) whatever_you_want_to_do_with_them
    
    然后你会打电话:

    a some_a;
    b some_b;
    
    UGLY(some_a, x, y);
    UGLY(some_b, b, a);
    

    您可以特别查看。

    您可以特别查看。

    没有特别好的方法来迭代类成员。我使用的一种方法是将值存储在元组中,并在需要时提供命名访问器:

    struct a {
        std::tuple<int, char*> stuff;
        int  & x() {return std::get<0>(stuff);}
        char & y() {return std::get<1>(stuff);}
    };
    
    结构a{ std::元组内容; int&x(){return std::get(stuff);} char&y(){return std::get(stuff);} }; 将来(也许明年?)我们应该为函数返回类型获得类型推断(正如我们已经为lambdas做的那样),这将删除每个访问器中容易出错的类型说明符


    然后可以使用可变模板函数来迭代元组。

    没有特别好的方法来迭代类成员。我使用的一种方法是将值存储在元组中,并在需要时提供命名访问器:

    struct a {
        std::tuple<int, char*> stuff;
        int  & x() {return std::get<0>(stuff);}
        char & y() {return std::get<1>(stuff);}
    };
    
    结构a{ std::元组内容; int&x(){return std::get(stuff);} char&y(){return std::get(stuff);} }; 将来(也许明年?)我们应该为函数返回类型获得类型推断(正如我们已经为lambdas做的那样),这将删除每个访问器中容易出错的类型说明符


    然后可以使用可变模板函数对元组进行迭代。

    为什么不将结构(具有相同的memeber类型,但名称不同)表示为元组?。IMHO如果您想以相同的方式处理这组结构,使用不同的名称会适得其反:

    template<typename...Ts>
    void f(const std::tuple<Ts...>& tuple)
    {
        ...
    }
    
    模板
    void f(const std::tuple和tuple)
    {
    ...
    }
    
    为什么不将结构(具有相同的memeber类型,但名称不同)表示为元组?。IMHO如果您想以相同的方式处理这组结构,使用不同的名称会适得其反:

    template<typename...Ts>
    void f(const std::tuple<Ts...>& tuple)
    {
        ...
    }
    
    模板
    void f(const std::tuple和tuple)
    {
    ...
    }
    
    结构的成员名称是否都不同?他们都只有两名成员吗?如果没有更多的信息,就无法做到这一点,IMHO。是的,成员名称是不同的。它在不同的结构中有2到6个成员变量。结构中的成员名称是否都不同?他们都只有两名成员吗?如果没有更多的信息,就无法做到这一点,IMHO。是的,成员名称是不同的。它在不同的结构中有2到6个成员变量。是否有关于函数返回类型推断的草案;但是我手头没有链接。在您的示例中有一个bug,您将第二个元组参数声明为char*,然后返回对char的引用,您可能需要char*&来代替。您确实说过它容易出错:)您可能可以使用:-struct a{std::tuple stuff;decltype(std::get(stuff))&x(){return std::get(stuff);}decltype(std::get(stuff))&y(){return std::get(stuff);};相反,更不容易出错但更详细。。。(呃,我看不出这个格式)@jcoder:很好。我注意到了这一点,但决定将其保留下来,以证明它容易出错(如下一段所述)。编译器应该发现错误,这样就不会太严重了
    decltype
    同样容易出错,因为您要复制元组索引;所以我认为在我们得到类型推断之前,这是我们能做的最好的了。有没有关于函数返回类型推断的草案;但是我手头没有链接。在您的示例中有一个bug,您将第二个元组参数声明为char*,然后返回对char的引用,您可能需要char*&来代替。您确实说过它容易出错:)您可能可以使用:-struct a{std::tuple stuff;decltype(std::get(stuff))&x(){return std::get(stuff);}decltype(std::get(stuff))&y(){return std::get(stuff);};相反,更不容易出错但更详细。。。(呃,我看不出这个格式)@jcoder:很好。我注意到了这一点,但决定将其保留下来,以证明它容易出错(如下一段所述)。编译器应该发现错误,这样就不会太严重了
    decltype
    同样容易出错,因为您要复制元组索引;因此,我认为在得到类型推断之前,这是我们能做的最好的事情。结构都有不同的名称和不同/不同的成员类型。我的意思是,例如,
    struct A
    struct B
    具有相同的meber类型,但名称不同。请注意,我建议您使用一个元组,以实现对具有不同成员数的结构的注释。这些结构都具有不同的名称和不同/不同的成员类型。我的意思是,例如,
    struct a
    struct B
    具有相同的meber类型,但名称不同。注意,我建议您使用一个元组,以实现对具有不同成员数的结构的注释。