标签: variadic

可变参数宏中标记的串联

在 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)

建议?

c macros variadic

4
推荐指数
1
解决办法
4267
查看次数

如何在后续块中访问va_list

方法签名是......

- (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 argsSOME_BLOCK... 内部发牢骚Cannot refer to declaration with an array type inside block.为什么不?这是"范围内",不是吗?试图__block va_list无济于事.建议吗?理由?

syntax scope variadic variadic-functions objective-c-blocks

4
推荐指数
1
解决办法
555
查看次数

是否有可能在golang中使用自定义库触发编译时错误?

让我们说,我min()(例如)我有一个可变函数来定义所提供的多个值的最小值.

如果调用者没有提供任何参数,我想暂停编译过程(因为这将是调用者中的错误,而不是我的函数中的错误).

怎么做?

function variadic go

4
推荐指数
1
解决办法
546
查看次数

模板函数指针和 lambdas

嗨,我正在尝试使用以下代码解决问题:

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)

https://godbolt.org/z/UaXxFJ

任何人都可以解释为什么有必要将 lambda 包裹起来Func<int&>( )?有没有办法避免它?- 因为如果参数列表不重要,则必须两次列出参数类型会变得非常乏味。

这里的目标是创建一个编译器可以优化掉的访问者模式。我将它用于图像处理算法,我想在其中重用外部循环的代码,以及各种位的内部代码。将Args被用作类似拉姆达捕捉的东西,除了使用传统的函数指针,以便编译器能够优化他们走-它似乎不能够做std::function<>

c++ lambda templates variadic

4
推荐指数
1
解决办法
121
查看次数

C/C++ 构建通用栈帧来调用不同的回调函数

我正在重构一个 C++ 应用程序,它引用了一堆多个回调函数,每个回调函数都有不同数量的参数,我想知道在调用每个函数之前是否有一种通用的方法来构建专用的参数堆栈框架。

换句话说:首先根据要调用的函数获取所有必需的参数,然后执行对被调用函数透明的调用。

在某种程度上,这与可变参数函数相反,因为这将是一个知道它可以接收不同数量参数的单个函数。在这里,我有一堆不可变的常规函数​​,我想从通用集线器调用它们。

我把CC++标签都放在这里是因为我对这两种语言的命题都很感兴趣,我觉得适用于 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)

...无论函数本身如何,将编译调用限制为唯一数量的参数,但我仍然希望做得更好。

在此先感谢大家。

c c++ variadic stack-frame

4
推荐指数
1
解决办法
119
查看次数

C++ 实例化模板可变参数类

我有这个代码:

#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++ templates variadic

4
推荐指数
1
解决办法
61
查看次数

使用stdargs(va_start)的C程序的奇怪行为(SEGFAULT)

我编写了一个可变参数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)

c malloc variadic segmentation-fault

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

检查可变参数模板声明中的参数类型

我得到了一个简单的可变参数模板声明,就像经典的一样:

template <typename... Arguments>
class VariadicTemplate;
Run Code Online (Sandbox Code Playgroud)

我需要实现的是让VariadicTemplate类执行某些类型检查; 可变参数模板应以某种迭代形式检查接收到的所有参数应该说明类型<Foo>.

我在某个地方看到了类似的东西,但现在我无法辨认它在哪里:P

c++ templates variadic

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

cpp:使用省略号捕获异常并查看信息

我知道你可以捕获"所有异常"并打印异常

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()方法.

我还没有尝试过,但如果有人知道我会很高兴知道如何.

c++ try-catch ellipsis variadic

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

C++ - 检查所有模板参数是否为2的幂

我试图找到一种简单的方法来检查作为模板参数传递的参数是否都是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解决方案.

templates variadic constexpr c++11

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