我正在使用很棒的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)
有没有办法/解决方法来做到这一点?
如何获取参数包的前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 的组合来实现,但我想知道是否有更简单的方法。
我有一个守护进程,它读取配置文件以便知道在哪里写东西.在配置文件中,存在如下行:
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()谈谈,这看起来很难看.
我希望为用户提供这种灵活性,但是我正在寻找一种合理,便携的方式来实现它.对于如何开始搜索这个问题,我也完全失败了.
如果符合以下条件,我会非常高兴:
我不希望为我编写代码,我只是坚持(我认为)应该是非常简单的东西,并需要一些帮助第一口.我真的觉得我在思考并忽略了明显的东西.
最终结果应该是这样的布尔函数:
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.完整性检查很容易,我只是有点时间获取格式正确的参数的数量(和顺序).
提前致谢.此外,如果您有这样的声誉,请随时编辑此标题,正如我所说,我不太确定如何在一行中提出问题.我认为我需要的是一个解析器,但使用一个完整的词法分析器/解析器处理一个简单的字符串感觉很尴尬.
我读它是基于 Boost的版本,但我不太确定它在实现时的意义.我知道Boost有他们自己的可变参数模板,但我认为c ++ 0x会使用自己的可变参数模板作为新元组.
我需要向函数发送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) 我在向函数传递可变数量的参数时遇到问题:
-(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)
我可以在第一个位置传递一个虚拟对象并给出所需的结果,但必须有一个更好的解决方案.谢谢!
请考虑以下伪代码:
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类?
我的问题是关于以下代码:
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) 我有一个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中定义可变参数多功能的惯用方法是什么?
考虑以下计划:
#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++标准是否说构造函数可以是可变参数?这种构造函数有什么用?允许可变参数构造函数的基本原理是什么?
variadic ×10
c++ ×6
c++11 ×3
templates ×3
c ×1
clojure ×1
constructor ×1
fmt ×1
formatting ×1
function ×1
objective-c ×1
parameters ×1
php ×1
polymorphism ×1
string ×1
tokenize ×1
tuples ×1
variables ×1