相关疑难解决方法(0)

可以使用模板按名称访问struct变量吗?

我们假设我有一个这样的结构:

struct my_struct
{
  int a;
  int b; 
}
Run Code Online (Sandbox Code Playgroud)

我有一个函数应该为"a"或"b"设置一个新值.此函数还需要指定要设置的变量.一个典型的例子是这样的:

void f(int which, my_struct* s, int new_value)
{
  if(which == 0)
     s->a = new_value;
  else
     s->b = new_value; 
}
Run Code Online (Sandbox Code Playgroud)

由于我不会在这里写的原因,我无法将指针传递给a/b到f.所以我不能用my_struct :: a或my_struct :: b的地址调用f.我不能做的另一件事是在my_struct中声明一个向量(int vars [2])并将一个整数作为索引传递给f.基本上在f中我需要按名称访问变量.

以前的例子的问题是,在将来我计划向struct添加更多变量,在这种情况下,我将记得向f添加更多if语句,这对于可移植性是不利的.我能做的就是将f写为宏,如下所示:

#define FUNC(which)
void f(my_struct* s, int new_value) \
{ \
        s->which = new_value; \
} 
Run Code Online (Sandbox Code Playgroud)

然后我可以调用FUNC(a)或FUNC(b).

这可行,但我不喜欢使用宏.所以我的问题是:有没有办法使用模板而不是宏来实现相同的目标?

编辑:我将尝试解释为什么我不能使用指针,我需要按名称访问变量.基本上,结构包含系统的状态.该系统需要在请求时"撤消"其状态.使用名为undo_token的接口处理撤消,如下所示:

class undo_token
{
public:
   void undo(my_struct* s) = 0;
};
Run Code Online (Sandbox Code Playgroud)

因此,由于多态性,我无法将指针传递给undo方法(mystruct也包含其他类型的变量).

当我向结构中添加一个新变量时,我通常还会添加一个新类,如下所示:

class undo_a : public undo_token
{
  int new_value;
public:
  undo_a(int new_value) { …
Run Code Online (Sandbox Code Playgroud)

c++ templates

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

什么时候.h不需要包含头文件?

这有效:

#include <iostream>
using namespace std;
Run Code Online (Sandbox Code Playgroud)

但这失败了:

#include <stdio>
Run Code Online (Sandbox Code Playgroud)

什么时候.h不需要?

关于命名空间问题,我没有找到这样的逻辑cstdio:

#pragma once
#ifndef _CSTDIO_
#define _CSTDIO_
#include <yvals.h>

#ifdef _STD_USING
 #undef _STD_USING
  #include <stdio.h>
 #define _STD_USING

#else /* _STD_USING */
 #include <stdio.h>
#endif /* _STD_USING */

// undef common macro overrides
 #undef clearerr
 #undef feof
 #undef ferror
 #undef getc
 #undef getchar
 #undef putc
 #undef putchar

 #define _HAS_CONVENTIONAL_CLIB 1
 #define _IOBASE    _base
 #define _IOPTR _ptr
 #define _IOCNT _cnt

#ifndef _FPOSOFF
  #define _FPOSOFF(fp)  ((long)(fp))
#endif /* _FPOSOFF …
Run Code Online (Sandbox Code Playgroud)

c++ include

3
推荐指数
2
解决办法
3747
查看次数

标签 统计

c++ ×2

include ×1

templates ×1