【问题标题】:C++ Pass struct member as argumentC++ 传递结构成员作为参数
【发布时间】:2014-12-15 09:35:32
【问题描述】:

我有一个根据输入参数计算结构的函数。 是否可以编写一个函数,通过将所需变量作为参数传递,只返回计算结构的某个变量? 问题是结构必须在函数内部创建和计算,所以我只知道结构成员未来的变量名。

基本上我想要的是用我作为主“DoSomethingSpecific”函数的参数的变量替换以下硬编码的“->member1”部分。

double DoSomethingSpecific()
{
  struct *s = CalculateStruct();
  DoSomethingElse(s->member1);
}

编辑: 我创建了一个基于现在有效的答案的最小示例,并解决了将结构成员作为变量传递给函数而不创建结构本身的实质性问题。但是,在这种情况下,必须事先知道数据类型(int)(否则如果需要模板会有所帮助)

#include <iostream>
using namespace std;

struct MyStruct
{
   int a;
   int b;
};

int GetVariable(int MyStruct::* field)
{
   MyStruct *_myStruct = new MyStruct();
   _myStruct ->a = 1;
   _myStruct ->b = 2;

   return _myStruct->*field;
}

int main( )
{
   int my_variable = GetVariable(&MyStruct::a); 
   return 0;   
}  

【问题讨论】:

  • 你可以有一个指向成员的指针。不过看起来有点粗略。
  • 如果我的结构在函数调用之前不存在,我如何获得指向该成员的指针?
  • 结构的实例还是结构本身?您不需要实例来拥有指向成员的指针。
  • 如果member1 是一个整数(int),那么只需创建一个带有int 参数的DoSomethingElse 函数?然后您可以将 any int 值或变量(成员或非成员)传递给它。

标签: c++ struct arguments


【解决方案1】:

如果你知道它的类型,你可以传递一个指向它的指针。在构造 Struct 时,您使用指针初始化成员。

【讨论】:

    【解决方案2】:

    你可以传入一个指向数据成员的指针:

    double DoSomethingSpecific(double Struct::* field)
    {
      Struct *s = CalculateStruct();
      DoSomethingElse(s->*field);
    }
    

    然后调用它:

    DoSomethingSpecific(&Struct::member1);
    

    编辑,根据您编辑的问题进行修复:

    int GetVariable(int MyStruct::* field)
    {
        MyStruct *_myStruct = new MyStruct();
        _myStruct->a = 1;
        _myStruct->b = 2;
    
        return _myStruct->*field;
    }
    

    【讨论】:

    • 现在先生,是syntax-o-hell :D 但我想它可以工作
    • @Creris:如果您认为指向数据成员的指针很讨厌,那么您使用 C++ 的时间不长。 ;-)
    • 好吧,我见过很多,但实际上我从未见过 ->* 或 .* 的任何实际用途,所以这有点令人惊讶。 SFNIAE 总体上要差得多
    • 感谢您的建议。我在一个最小的示例中进行了尝试,我现在将其复制到问题中以进一步缩小问题范围。但是 Struct::* 字段的语法似乎不起作用,因为它无法编译:错误:在 '*' 标记之前预期的 unqualified-id 错误:在此范围内未声明 'field' 错误:预期的 ',' 或';' 在 '{' 标记之前
    • @user1810304:我编辑了我的答案并修复了您的新代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 2015-01-21
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多