如何使用可变参数模板在C ++ 11中不递归地形成字符串

问题描述 投票:0回答:1
template <typename ...Args>
void logImpl(tloglevel level, Args&& ...args)
{
    ostringstream stream;
    (stream << ... << std::forward<Args>(args)) << '\n';
    syslog(level, stream.str());
}

func A()
{
int a =10;
std::string b = "test";
logImpl(LOG_INFO, "printing",a,b);
}

func B()
{
unsigned long t = 6700;
logImpl(LOG_INFO, t);
}

我知道我们可以使用可变参数模板来实现它。但是有可能不做递归吗?折叠表达式不是一个选项,因为仅支持c ++ 11。请让我知道是否还有其他人使用可变参数模板而不进行递归或折叠表达。我想在c ++ 11中做到这一点。

c++11 variadic-templates
1个回答
0
投票

您无需使用递归即可完成这项工作。

您可以在填充时使用扩展参数包创建伪数组:

template<class ... Args>
std::string makeString(Args...args){
    std::string s;
    int temp[] = { (s += toString(args),0)... }; // concatenation
    static_cast<void>(temp);
    return s;
}

对于toString,您提供了用于处理所需所有类型的重载。

例如:

template<class T>
std::string toString(T t){
    return std::to_string(t);   // for numbers 
}

std::string toString(const std::string& str){
    return str;
}

std::string toString(const char* str){
    return str;
}

Full demo


嗯,您甚至都没有使用toString,带有ostringstream的版本是:

template<class ... Args>
std::string makeString(Args&&...args){
    std::ostringstream os;
    int temp[] = { ((os << std::forward<Args>(args)),0)... };
    static_cast<void>(temp);
    return os.str();
}
© www.soinside.com 2019 - 2024. All rights reserved.