将未知类型和数量的args和concat传递给char数组

时间:2016-12-17 16:32:22

标签: c++ arrays templates generics variadic-functions

有没有办法将未知数量的args(可以是char字符串或整数)传递给函数,然后将它们连接到char数组缓冲区?

例如,为了能够调用以下所有函数:

bufcat("this", 1, 3, "that");  
// buffer = "this13that"
bufcat(1, "this", "that", 3, 4000000, "other");
// buffer = "1thisthat34000000other"
bufcat(1000000,2,3,4,5,6,7,8,9,10,11,12,13,"onemillionandfiftytwo");
// buffer = "10000002345678910111213onemillionandfiftytwo"

2 个答案:

答案 0 :(得分:3)

您可以使用可变参数模板和字符串流:

iteration

这将连接您将参数传递到字符串流中的任何内容。它将为Args中的每个参数调用bufcat(1000000,2,3,4,5,6,7,8,9,10,11,12,13,"onemillionandfiftytwo"); lambda。

然后,你可以简单地调用你的函数:

10000002345678910111213onemillionandfiftytwo

它会产生fun hasPermission(permission: String): Boolean { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) return true // must be granted after installed. return mAppSet.appContext.checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED }

答案 1 :(得分:0)

使用可变参数模板在c ++ 11中可以使用简单的解决方案。 如果性能很重要,那么经典printf习惯用法所需的样板代码可能比这里使用的内存分配更容易接受。

#include <string>
#include <iostream>
inline std::string bufcat() { return ""; }
template<typename value_type> std::string bufcat(const value_type &value)    { return std::to_string(value); }
template<> std::string bufcat(const bool &b) { return b ? "true" : "false"; }
std::string bufcat(const std::string &str) { return str; }
std::string bufcat(const char *str) { return str; }
template <typename arg0_type, typename ...arg_types>
std::string bufcat(arg0_type arg0, arg_types ... args)
{ return bufcat(arg0).append(bufcat(args...)); }

int main()
{
    std::cout << bufcat(1000000,2,3,4,5,6,7,8,9,10,11,12,13,"onemillionandfiftytwo") << "\n";
}