标签: variadic

如何将非可变参数值传递给 fmt::format?

我正在使用很棒的fmt C++ 库来更优雅地格式化字符串。

我想将一个非变量参数列表传递给fmt::format. 它可能是一个std::vector, 或std::string或其他任何形式,但它始终与格式字符串匹配。

所以fmt::format工作原理如下:

std::string message = fmt::format("The answer is {} so don't {}", "42", "PANIC!");
Run Code Online (Sandbox Code Playgroud)

但我想要的是这样的:

std::vector<std::string> arr;
arr.push_back("42");
arr.push_back("PANIC!");
std::string message = fmt::format("The answer is {} so don't {}", arr);
Run Code Online (Sandbox Code Playgroud)

有没有办法/解决方法来做到这一点?

c++ formatting variadic variadic-functions fmt

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

C++:获取参数包的头和尾

如何获取参数包的前n个元素?或者最后 n 个元素,或者 [n, n+1, ..., m) 中的一片元素?例如:

head<3>(1, 2.0f, "three", '4') => make_tuple(1, 2.0f, "three")
tail<2>(1, 2.0f, "three", '4') => make_tuple("three", '4')
slice<1,3>(1, 2.0f, "three", '4') => make_tuple(2.0, "three")
Run Code Online (Sandbox Code Playgroud)

这可以通过 std::tuple、std::integer_sequence 和 std::get 的组合来实现,但我想知道是否有更简单的方法。

c++ templates variadic parameter-pack

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

基于格式字符串的智能可变扩展

我有一个守护进程,它读取配置文件以便知道在哪里写东西.在配置文件中,存在如下行:

output = /tmp/foo/%d/%s/output
Run Code Online (Sandbox Code Playgroud)

或者,它可能看起来像这样:

output = /tmp/foo/%s/output/%d
Run Code Online (Sandbox Code Playgroud)

......或者只是这样:

output = /tmp/foo/%s/output
Run Code Online (Sandbox Code Playgroud)

......或者最后:

output = /tmp/output
Run Code Online (Sandbox Code Playgroud)

我在程序中将该行作为cfg-> pathfmt.我现在要做的是想出一些巧妙的使用方法.

再解释一下,路径最多可以包含两个要格式化的组件.%d将作为作业ID(int)扩展,%s将作为作业名称(字符串)扩展.用户可能希望在配置文件中使用一个,两个或不使用.在我最终将它传递给snprintf()之前,我需要知道他们想要什么,以什么顺序.我可以把它缩小范围,但我一直想和strtok()谈谈,这看起来很难看.

我希望为用户提供这种灵活性,但是我正在寻找一种合理,便携的方式来实现它.对于如何开始搜索这个问题,我也完全失败了.

如果符合以下条件,我会非常高兴:

  • 有人可以帮我缩小搜索短语以找到好的例子
  • 有人可以发布指向实现此功能的OSS项目的链接
  • 有人可以发布一些伪代码

我不希望为我编写代码,我只是坚持(我认为)应该是非常简单的东西,并需要一些帮助第一口.我真的觉得我在思考并忽略了明显的东西.

最终结果应该是这样的布尔函数:

bool output_sugar(const char *fmt, int jobid, const char *jobname, struct job *j);
Run Code Online (Sandbox Code Playgroud)

然后它将在j-> outpath上调用snprintf()(明智地),如果某种垃圾(即%后跟不是s,d或%的东西)在配置行(或其null)中则返回false.完整性检查很容易,我只是有点时间获取格式正确的参数的数量(和顺序).

提前致谢.此外,如果您有这样的声誉,请随时编辑此标题,正如我所说,我不太确定如何在一行中提出问题.我认为我需要的是一个解析器,但使用一个完整的词法分析器/解析器处理一个简单的字符串感觉很尴尬.

c string variadic tokenize

4
推荐指数
2
解决办法
433
查看次数

c ++ 0x元组是否使用新的可变参数模板或Boost的宏命令元组实现?

我读它是基于 Boost的版本,但我不太确定它在实现时的意义.我知道Boost有他们自己的可变参数模板,但我认为c ++ 0x会使用自己的可变参数模板作为新元组.

c++ templates tuples variadic c++11

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

用(未知)可变数量的参数调用函数?

我需要向函数发送params

array_intersect_key()
Run Code Online (Sandbox Code Playgroud)

但有时我需要发送2个阵列,有时候 - 3个或更多:

array_intersect_key($arr_1, $arr_2);
OR
array_intersect_key($arr_1, $arr_2, $arr_3, $arr_4);
Run Code Online (Sandbox Code Playgroud)

php function variadic

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

obj-C中的变量函数跳过第一个参数

我在向函数传递可变数量的参数时遇到问题:

-(void)addCharacterToScene:(NSString *)name withFrames:(CCSpriteFrame*)frames,... {
    va_list args;
    va_start(args, frames);
    id arg = va_arg(args,CCSpriteFrame*);
    int i=1;
    while (arg) {
        NSString *frame_name = [NSString stringWithFormat:@"%@_%i",name,i];
        NSLog(@"%@ \n%@",frame_name, arg);
        [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFrame:arg name:frame_name];
        arg = va_arg(args,CCSpriteFrame*);
        i++;
    }
    va_end(args);
}
Run Code Online (Sandbox Code Playgroud)

问题是该函数跳过了第一个参数.我对函数的调用如下所示:

[self addCharacterToScene:@"wiz" withFrames:wizardFrame1,wizardFrame2,wizardFrame3,nil];
Run Code Online (Sandbox Code Playgroud)

我可以在第一个位置传递一个虚拟对象并给出所需的结果,但必须有一个更好的解决方案.谢谢!

variables parameters objective-c variadic cocos2d-iphone

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

是否可以生成参数包?

请考虑以下伪代码:

template<class... T>
struct worker : unique<T...>::type...{};
struct x{};
struct y{};
struct z{};
Run Code Online (Sandbox Code Playgroud)

是否有可能编写模板unique这样就产生一个参数包组成中,只有独特类型的TS,以便worker<x,y,x,z>将直接导出x,y,z分别按照这个顺序,给出Ts为无final类?

c++ variadic variadic-templates c++11

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

使用variadic模板作为类和方法的参数

我的问题是关于以下代码:

    template <class...T>
    class A
    {
    public:
        template <class...S>
        static void a() { }
    };

    template <class...T>
    class B
    {
    public:
        template <class...S>
        void b()
        {
            A<T...>::a<S...>();
        }
    };

    int main(int argc, char** argv)
    {
        return 0;
    }
Run Code Online (Sandbox Code Playgroud)

我有一个A具有可变参数模板的类,并包含一个a具有另一个可变参数模板的静态方法.从其他地方(B在本例中为类)我有两组不同的可变参数模板我想传递给它A::a.

编译器(GCC 4.8.1)给出以下错误消息:

    main.cpp: In static member function ‘static void B<T>::b()’:
    main.cpp:16:22: error: expected primary-expression before ‘...’ token
             A <T...>::a<S...>();
                          ^
    main.cpp:16:22: error: expected ‘;’ before ‘...’ token
Run Code Online (Sandbox Code Playgroud)

另请注意,当我将方法更改为b():

        void b()
        { …
Run Code Online (Sandbox Code Playgroud)

c++ templates variadic c++11

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

如何在clojure中编写可变参数defmulti/defmethod

我有一个defmulti/defmethod组,它接受这样的参数......

(defmulti foo "some explanation" (fn [arg1 arg2] (mapv class [arg1 arg2])))
(defmethod foo [N P] (->L 1 2 3))
(defmethod foo [L P] (->N 5))
(defmethod foo [P N] (->L 6 7 8))
 ...
Run Code Online (Sandbox Code Playgroud)

以您期望的方式调用它们.

(foo (->N 9) (->P 9))
Run Code Online (Sandbox Code Playgroud)

我想要的是用超过2个参数调用'foo'.我知道如何使用函数执行此操作,我想我可以使用一些包装函数将args拆分成对,然后组合结果(或者只使用'reduce'),但这似乎是错误的.

我的问题是......在clojure中定义可变参数多功能的惯用方法是什么?

polymorphism clojure variadic

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

在C++中使用可变参数构造函数有什么用?

考虑以下计划:

#include <iostream>
struct Test
{
    Test(...)
    {
        std::cout<<"Variadic constructor\n";
    }
};
int main()
{
    Test t;
    t={3,4,5};
}
Run Code Online (Sandbox Code Playgroud)

我认为它是可变构造函数.C++标准是否说构造函数可以是可变参数?这种构造函数有什么用?允许可变参数构造函数的基本原理是什么?

c++ constructor variadic variadic-functions

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