相关疑难解决方法(0)

Variadic递归预处理器宏 - 它可能吗?

我遇到了一些理论问题.在一段代码中,我维护着一组宏

#define MAX_OF_2(a, b)       (a) > (b) ? (a) : (b)
#define MAX_OF_3(a, b, c)    MAX_OF_2(MAX_OF_2(a, b), c)
#define MAX_OF_4(a, b, c, d) MAX_OF_2(MAX_OF_3(a, b, c), d)
...etc up to MAX_OF_8
Run Code Online (Sandbox Code Playgroud)

我想做的是用这样的东西替换它们:

/* Base case #1, single input */
#define MAX_OF_N(x)      (x)

/* Base case #2, two inputs */
#define MAX_OF_N(x, y)   (x) > (y) ? (x) : (y)

/* Recursive definition, arbitrary number of inputs */
#define MAX_OF_N(x, ...) MAX_OF_N(x, MAX_OF_N(__VA_ARGS__))
Run Code Online (Sandbox Code Playgroud)

...当然,这是无效的预处理器代码.

忽略这个特殊情况应该使用函数而不是预处理器宏来解决,是否可以定义一个可变的MAX_OF_N()宏?

为了清楚起见,最终结果应该是一个宏,它接受任意数量的参数并评估其中最大的参数.我有一种奇怪的感觉,这应该是可能的,但我没有看到如何.

macros c-preprocessor

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

使用涂料矢量来访问多维数组的任意轴向切片?

我正在构建一套函数来处理多维数组数据结构,我希望能够定义数组的任意切片,这样我就可以实现两个任意矩阵(又称Tensorsnd数组)的广义内积.

一个APL论文我看了(老实说,我无法找到它-我已经看了这么多)定义的矩阵产品上左矩阵X,其尺寸A;B;C;D;E;F和右矩阵Y,尺寸G;H;I;J;K,其中F==G作为

Z <- X +.× Y
Z[A;B;C;D;E;H;I;J;K] <- +/ X[A;B;C;D;E;*] × Y[*;H;I;J;K]
Run Code Online (Sandbox Code Playgroud)

其中+/和的和,并且×将元素逐个元素应用于两个相同长度的向量.

所以我需要左边的"行"切片和右边的"列"切片.我当然可以使用转置,然后使用"行"切片来模拟"列"切片,但我宁愿更优雅地做.

维基百科关于切片的文章引出了关于涂料载体的存根,这似乎是我正在寻找的奇迹治疗,但是没有太多可以继续下去.

如何使用涂料矢量来实现任意切片?

(很久以后我注意到了一个有一些细节的数组的Stride.)

c transpose slice multidimensional-array matrix-multiplication

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

是否可以对可变参数宏进行字符串化?

gcc (GCC) 4.7.2
c89
Run Code Online (Sandbox Code Playgroud)

是否可以对可变参数宏进行字符串化?

我有以下宏,我想从fmt和参数输出结果字符串.

#define ERROR_MESSAGE(priority, fmt, ...)        \
    do {                                         \
        MODULE_LOG(priority, fmt, ##__VA_ARGS__);\
} while(0)
Run Code Online (Sandbox Code Playgroud)

所以,我只是想获得的整个字符串fmt##__VA_ARGS__这样我就可以把它分配给char *在其上执行一些额外的操作.

c macros

3
推荐指数
1
解决办法
2096
查看次数

如何编写一个"知道"自己的变量名的类

所以我想假设我有以下类定义:

class my_named_int {
public:
    int value;
    const string name;
    my_named_int(int _value, /*...Does Something Go Here...?*/);
};
Run Code Online (Sandbox Code Playgroud)

我想要的是,如果我写下面的代码:

int main() {
    my_named_int my_name(5);
    std::cout << my_name.name << ":" << my_name.value << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

我希望输出为:

my_name:5
Run Code Online (Sandbox Code Playgroud)

显然,解决这个问题的最简单方法是编写如下代码:

class my_named_int {
public:
    int value;
    const string name;
    my_named_int(int _value, const string & _name);
};

int main() {
    my_named_int my_name(5, "my_name");
    std::cout << my_name.name << ":" << my_name.value << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

但是,当然,这会增加我的代码的重复性.有没有办法在没有变量名称的"双重写入"的情况下在C++中执行此操作,如果是这样,我将如何处理它?

c++

3
推荐指数
1
解决办法
155
查看次数