我遇到了一些理论问题.在一段代码中,我维护着一组宏
#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()宏?
为了清楚起见,最终结果应该是一个宏,它接受任意数量的参数并评估其中最大的参数.我有一种奇怪的感觉,这应该是可能的,但我没有看到如何.
我正在构建一套函数来处理多维数组数据结构,我希望能够定义数组的任意切片,这样我就可以实现两个任意矩阵(又称Tensors或nd数组)的广义内积.
一个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
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 *在其上执行一些额外的操作.
所以我想假设我有以下类定义:
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++中执行此操作,如果是这样,我将如何处理它?