相关疑难解决方法(0)

使用从string中提取的参数调用函数

我正在看以下问题:

我得到格式如下的字符串:

functionname_parameter1_parameter2_parameter3
otherfunctionname_parameter1_parameter2
.
.
.
Run Code Online (Sandbox Code Playgroud)

我想用给定的参数调用函数.所以假设我有一个功能测试:

void test(int x, float y, std::string z) {}
Run Code Online (Sandbox Code Playgroud)

我收到一条消息:

test_5_2.0_abc
Run Code Online (Sandbox Code Playgroud)

那么我想像这样自动调用函数测试:

test(5, 2.0, "abc");
Run Code Online (Sandbox Code Playgroud)

您是否有任何关于如何在C++中实现此目的的提示?

c++ reflection binding parsing function

7
推荐指数
1
解决办法
4466
查看次数

TMP:如何编写将任何结构转换为元组的模板代码?

是否可以使用模板元编程将任何结构或类转换为元组?

例如:

struct Foo
{
  char         c;
  int          i;
  std::string  s;
};

typedef std::tuple< char, int, std::string >  Foo_Tuple;
Run Code Online (Sandbox Code Playgroud)

有一些模板代码会自动为我生成Foo_Tuple会很不错.

回答

这对于这样一个简单的案例来说太过分了,但是对于更复杂的案例(例如ORM或任何时候你需要编写大量的样板代码,而单纯的模板或宏不适合这项任务),Boost Mirror看起来像它可能非常有用.我更多地挖掘了Boost Mirror:基本的反射功能(在Mirror和Puddle中)不难理解,很容易设置并且看起来相当广泛(可以处理许多构造,包括C++ 11枚举类等...).我发现这个基本功能已经足够了 - 我可以使用MACROS到我希望将我的类暴露给Reflection的程度(这样我就不必编写样板代码).Factory生成器似乎也非常强大(使用相同的初始宏设置,您可以交换任何您想要输出JSON,SOCI或流等的工厂生成器...),但具有更大的学习曲线/设置,如果你想编写自己的工厂发电机.最后几个注释:通过一些小的调整,我能够在gcc 4.7.2上使用C++ 11; 此外,文档已经充分加氧,似乎有足够的例子可以快速进行.

c++ templates tuples c++11

7
推荐指数
1
解决办法
1152
查看次数

在C++中为类提供可访问的"名称"时,您如何"不重复自己"?

考虑以下:

class Base {
  public:
    virtual std::string getName() = 0;
    ...
};

class Derived1 : public Base {
  public:
    static std::string getClassName() { return("Derived1"); }
    std::string getName() { return("Derived1"); }
    ...
};

class Derived2 : public Base {
  public:
    static std::string getClassName() { return("Derived2"); }
    std::string getName() { return("Derived2"); }
    ...
};
Run Code Online (Sandbox Code Playgroud)

这个想法是,如果您将派生类作为模板参数传递,那么您可以通过它获取其类名getClassName,而如果您将它作为指向基类的指针传递,则可以通过获取名称getName.

我在这里看起来有很多类似的问题但是所有人似乎都在问"我如何使用静态虚拟","为什么不存在静态虚拟"以及类似的各种东西,而答案似乎是解决的问题不仅仅是我认为真正的潜在问题,那就是:我怎样才能避免重复使用该代码并在尽可能少的样板文件中提及名称两次?(不要重复自己,或干燥规则)

我也不想要一个宏.

c++ dry

7
推荐指数
1
解决办法
303
查看次数

在C++中使用String-To-Class Lookup表来实例化类

寻找一种避免大规模IF/ELSE并使用查找表将字符串解析为特定类来实例化的方法,这些方法都来自基类.这是可能的,如果是这样,怎么样?

typedef struct BaseClass
{
} BaseClass;

typedef struct DerivedClassOne : BaseClass
{
} DerivedClassOne;

typedef struct DerivedClassTwo : BaseClass
{
} DerivedClassTwo;

typedef struct
{
    const char *name;
    BaseClass class;
} LookupList;

LookupList list[] = {
    {"ClassOne", DerivedClassOne},
    {"ClassTwo", DerivedClassTwo}
};

BaseClass *InstantiateFromString(char *name)
{
    int i;
    for (i = 0; i < 2; i++)
    {
        if (!strcmp(name, list[i].name))
            return new list[i].class();
    }
}

int main (int argc, char *argv[])
{
    BaseClass *myObjectFromLookup = InstantiateFromString("ClassOne");
}
Run Code Online (Sandbox Code Playgroud)

c++

6
推荐指数
1
解决办法
2311
查看次数

从std :: string,C++获取类型

在面试中我被问到一个问题.

因此我有一个函数void f(std::string),我称之为函数f("int").所以我的函数必须int x在它的体内创建一个局部.有没有办法从中获取类型const char*.我知道boost::mpl::vector确实可以解决这类问题.谁能告诉我这项技术?

c++ algorithm types character-encoding stdstring

6
推荐指数
1
解决办法
1086
查看次数

通过变量名迭代struct

更新:6个月后,我刚刚遇到了这样的答案:索引结构是否合法?:Slava回答.我认为这是一个比这里提供的更好的解决方案,因为绝对没有未定义的行为.希望这对下一个人有所帮助,因为对我来说已经太晚了.


在您发表评论告诉我使用数组或向量或任何形式的容器之前,这是一个我不能做的事实.我知道,这将通过数组来解决,否则任何解决方案都非常"hacky".我很想用一个容器,但我绝对不能.

我是一家非常大的公司的中级开发人员,我们正在使用公司范围的库来通过以太网发送数据.有多种原因可以解释为什么它不能支持数组/向量,而是使用POD结构(普通旧数据 - 字符,浮点数,整数,粗体).我从一个浮点数开始,我必须使用它来填充具有相同浮点数的结构.由于这个库的目的是通过以太网发送消息,我只需要进行两次迭代 - 一次在发送上,一次在接收上.所有其他时间,此数据存储为数组.我知道 - 我应该将数组序列化并按原样发送,但我再说一遍 - 我绝对不能.

我有一个float[1024],必须遍历数组并填充以下结构:

struct pseudovector
{
    float data1;
    float data2;
    float data3;
    ...
    float data1024;
}
Run Code Online (Sandbox Code Playgroud)

我已经使用BOOST_PP_REPEATBOOST_PP_SEQ_FOR_EACH_I生成了这个结构,这样我就不必写出所有1024个浮点数,并且它增加了可维护性/可扩展性.

以同样的方式,我尝试通过预编译器##连接(/sf/answers/2031466041/)迭代结构,但由于这是在预编译时完成的,因此不能用于运行 - 获取/设置时间.

我已经研究过如何实现反射,例如如何向C++应用程序添加反射?Ponder Library,但这两种方法都要求您明确写出可以反映的每个项目.在这种情况下,我不妨std::map<string, float>通过字符串/整数连接在for循环中创建并迭代:

for(i=0;i<1024;i++)
{
    array[i] = map.get(std::string("data")+(i+1))
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以推荐一个更清洁的解决方案,不需要我写出超过1024行代码?非常感谢您的帮助!

我再说一遍 - 我绝对不能使用任何类型的数组/向量.

c++ iteration reflection iterator c-preprocessor

6
推荐指数
1
解决办法
1186
查看次数

如何在struct/class中获取有关"当前类型"的信息?

是否有可能获得"当前的类型struct" struct?例如,我想做这样的事情:

struct foobar {
  int x, y;

  bool operator==(const THIS_TYPE& other) const  /*  What should I put here instead of THIS_TYPE? */
  {
    return x==other.x && y==other.y;
  }
}
Run Code Online (Sandbox Code Playgroud)

我试着这样做:

struct foobar {
  int x, y;

  template<typename T>
  bool operator==(const T& t) const
  {
    decltype (*this)& other = t; /* We can use `this` here, so we can get "current type"*/
    return x==other.x && y==other.y;
  }
}
Run Code Online (Sandbox Code Playgroud)

但它看起来很难看,需要支持最新的C++标准,而MSVC不能编译它(它会因"内部错误"而崩溃).

实际上,我只是想编写一些预处理器宏来自动生成如下函数operator==:

struct foobar {
  int x, …
Run Code Online (Sandbox Code Playgroud)

c++ macros

5
推荐指数
1
解决办法
1374
查看次数

C ++自省技术,类似于python

C ++中是否存在像python中那样的自省技术?

例如:我想获得有关特定对象的更多信息,而无需遍历头文件或参考cpp参考。

我是在问一个正确的问题,还是在这里错误的方向?

更新:

根据以下答案,此答案与我的问题有关:如何向C ++应用程序添加反射?

c++ python introspection

5
推荐指数
2
解决办法
5424
查看次数

是否可以迭代结构或类中的所有元素?

是否可以迭代结构或类中的所有元素?

例如,如果我有三个不同类型的元素的结构:

struct A {
    classA a;
    classB b;
    classC c;
};
Run Code Online (Sandbox Code Playgroud)

然后我需要一些迭代器,这样方法next()会给我下一个元素的值.问题是,如您所见,值具有不同的类型.

c++ c++11

5
推荐指数
1
解决办法
470
查看次数

C++相当于Python的getattr

在python中,有一个名为getattr的函数,它看起来像这样:

class MyObject():
    def __init__(self):
        self.xyz = 4

obj = MyObject()
getattr(obj, 'xyz')
Run Code Online (Sandbox Code Playgroud)

对getattr的调用将返回4.

在C++(非Visual C++)中有类似的方法吗?

是否有任何具有此功能的库我可以使用字符串查找对象的成员变量?

我试图找到一种方法来查找我无法更改的C++类中的公共数据成员.所以我不能使用地图将字符串文字映射到值.也许像宏的'unstringify'?

c++ python serialization boost getattr

4
推荐指数
2
解决办法
1971
查看次数