在 C 中,是否可以连接可变参数宏中的每个变量参数?
例子:
MY_MACRO(A, B, C) // will yield HDR_A, HDR_B, HDR_C
MY_MACRO(X, Y) // will yield HDR_X, HDR_Y
Run Code Online (Sandbox Code Playgroud)
普通##运算符对可变参数宏具有特殊含义(避免空参数列表使用逗号)。使用 with 时的连接__VA_ARGS__只发生在第一个标记上。
例子:
#define MY_MACRO(...) HDR_ ## __VA_ARGS__
MY_MACRO(X, Y) // yields HDR_X, Y
Run Code Online (Sandbox Code Playgroud)
建议?
方法签名是......
- (void)blahBlahBlah:(NSString*)format, ... NS_FORMAT_FUNCTION(1,2) {
va_list args; va_start(args,format);
void(^SOME_BLOCK)(void) = ^{ [Heathens prayToJesusWith:
[NSString.alloc initWithFormat:kFMT
arguments:args]; }; ...
va_end(args);
}
Run Code Online (Sandbox Code Playgroud)
然而,Xcode args在SOME_BLOCK... 内部发牢骚Cannot refer to declaration with an array type inside block.为什么不?这是"范围内",不是吗?试图__block va_list无济于事.建议吗?理由?
让我们说,我min()(例如)我有一个可变函数来定义所提供的多个值的最小值.
如果调用者没有提供任何参数,我想暂停编译过程(因为这将是调用者中的错误,而不是我的函数中的错误).
怎么做?
嗨,我正在尝试使用以下代码解决问题:
template<typename... Args>
using Func = void (*)(Args... args);
template<typename... Args>
void do_test(Func<Args&...> f, Args&... args) {
for (int i = 0; i != 100; i++)
f(args...);
}
int main(){
int x = 0;
do_test(Func<int&>([](int &y) { y++; }), x); // OK
// Error - mismatched types 'void (*)(Args& ...)' and 'main()::<lambda(int&)>'
do_test([](int &y) { y++; }, x);
return x;
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释为什么有必要将 lambda 包裹起来Func<int&>( )?有没有办法避免它?- 因为如果参数列表不重要,则必须两次列出参数类型会变得非常乏味。
这里的目标是创建一个编译器可以优化掉的访问者模式。我将它用于图像处理算法,我想在其中重用外部循环的代码,以及各种位的内部代码。将Args被用作类似拉姆达捕捉的东西,除了使用传统的函数指针,以便编译器能够优化他们走-它似乎不能够做std::function<>
我正在重构一个 C++ 应用程序,它引用了一堆多个回调函数,每个回调函数都有不同数量的参数,我想知道在调用每个函数之前是否有一种通用的方法来构建专用的参数堆栈框架。
换句话说:首先根据要调用的函数获取所有必需的参数,然后执行对被调用函数透明的调用。
在某种程度上,这与可变参数函数相反,因为这将是一个知道它可以接收不同数量参数的单个函数。在这里,我有一堆不可变的常规函数,我想从通用集线器调用它们。
我把C和C++标签都放在这里是因为我对这两种语言的命题都很感兴趣,我觉得适用于 C 的东西也适用于 C++,我仍然对“仅限 C++”的解决方案持开放态度,例如可变参数模板等。
所有这一切的背景是引用的程序实际上是在解析命令行,然后根据命令的名称调用函数,作为程序名称后的第一个参数传递,然后所有必需的作为纯字符串,但取决于调用的命令.
我知道我可以写这样的东西:
if(nb_of_args == 1)
my_callback_ptr(argv[n]);
else if (nb_of_args == 2)
my_callback_ptr(argv[n],argv[n+1]);
else if (nb_of_args == 3)
my_callback_ptr(argv[n],argv[n+1],argv[n+2]);
else if (nb_of_args == 4)
my_callback_ptr(argv[n],argv[n+1],argv[n+2],argv[n+3]);
else if…
Run Code Online (Sandbox Code Playgroud)
...无论函数本身如何,将编译调用限制为唯一数量的参数,但我仍然希望做得更好。
在此先感谢大家。
我有这个代码:
#include <iostream>
template<class P>
void processAll() {
P p = P();
p.process();
}
class P1 {
public:
void process() { std::cout << "process1" << std::endl; }
};
int main() {
processAll<P1>();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
有没有办法使用模板变量将第二个类“P2”注入到我的函数“processAll”中?像这样的东西:
...
template<class... Ps>
void processAll() {
// for each class, instantiate the class and execute the process method
}
...
class P2 {
public:
void process() { std::cout << "process2" << std::endl; }
};
...
int main() {
processAll<P1, P2>();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我们可以迭代每个类吗?
我编写了一个可变参数C函数,其任务是为缓冲区分配所需的内存,然后sprintf在该缓冲区中给予该函数的args.但我发现它有一种奇怪的行为.它只工作一次.如果我对此功能有两次调用,则会出现段错误.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
char *xsprintf(char * fmt, ...)
{
va_list ap;
char *part;
char *buf;
size_t len = strlen(fmt)+1;
va_start(ap, fmt);
while (part = va_arg(ap, char *))
len += strlen(part);
va_end(ap);
buf = (char*) malloc(sizeof(char)*len);
va_start(ap, fmt);
vsprintf(buf, fmt, ap);
va_end(ap);
return buf;
}
int main(int argc, const char *argv[])
{
char *b;
b = xsprintf("my favorite fruits are: %s, %s, and %s", "coffee", "C", "oranges");
printf("size de buf is %d\n", strlen(b)); //this works. …Run Code Online (Sandbox Code Playgroud) 我得到了一个简单的可变参数模板声明,就像经典的一样:
template <typename... Arguments>
class VariadicTemplate;
Run Code Online (Sandbox Code Playgroud)
我需要实现的是让VariadicTemplate类执行某些类型检查; 可变参数模板应以某种迭代形式检查接收到的所有参数应该说明类型<Foo>.
我在某个地方看到了类似的东西,但现在我无法辨认它在哪里:P
我知道你可以捕获"所有异常"并打印异常
try
{
//some code...
}catch(const std::exception& e) {
cout << e.what();
}
Run Code Online (Sandbox Code Playgroud)
但这仅适用于从std :: exception派生的异常.我想知道是否有办法从省略号捕获中获取一些信息
try
{
//some code...
}catch(...) {
// ??
}
Run Code Online (Sandbox Code Playgroud)
如果机制与函数的省略号相同,那么我应该能够执行类似的操作va_list并尝试调用what()方法.
我还没有尝试过,但如果有人知道我会很高兴知道如何.
我试图找到一种简单的方法来检查作为模板参数传递的参数是否都是2的幂.我在网站上找到了一个bithack,我有这个:
constexpr bool isPowerOf2(size_t value){
return !(value == 0) && !(value & (value - 1));
}
Run Code Online (Sandbox Code Playgroud)
这适用于单个值,但将此应用于多个参数看起来很难看.
static_assert(isPowerOf2(Arg1), "Argument must be a power of 2");
static_assert(isPowerOf2(Arg2), "Argument must be a power of 2");
static_assert(isPowerOf2(Arg3), "Argument must be a power of 2");
Run Code Online (Sandbox Code Playgroud)
如果我能让它看起来像arePowersOf2(Arg1,Arg2,Arg3)会更好,但是我并不是真的在模板魔术方面先进.所以我的问题是:有一种简单的方法吗?我更喜欢constexpr C++ 11解决方案.