2014-10-06 177 views
0

我得到了一些示例代码从这里做一个C++可变参数模板:C++ 11可变参数模板

http://en.wikipedia.org/wiki/Variadic_template

我的代码如下。

#ifdef DEBUG 
    #define logDebug(x, ...) streamPrintf(x, ##__VA_ARGS__); 
#else 
    #define logDebug(x, ...) 
#endif 

void streamPrintf(const char *s); 
template<typename T, typename... Args> 
void streamPrintf(const char *s, T value, Args... args) 
{ 
while (*s) { 
    if (*s == '%') { 
     if (*(s + 1) == '%') { 
      ++s; 
     } 
     else { 
      std::cout << value; 
      streamPrintf(s + 1, args...); 
      return; 
     } 
    } 
    std::cout << *s++; 
} 
throw std::logic_error("extra arguments provided to printf"); 
} 

void streamPrintf(const char *s) 
{ 
while (*s) { 
    if (*s == '%') { 
     if (*(s + 1) == '%') { 
      ++s; 
     } 
     else { 
      throw std::runtime_error("invalid format string: missing arguments"); 
     } 
    } 
    std::cout << *s++; 
    } 
} 

但它只打印垃圾。使用这个的主要原因是我可以打印出std :: string。我怎样才能打印出正确的值?

我这样调用该函数:

logDebug("Event is, event=%", value); 

彼得牛逼通过聊天发现了这个问题。它不会正确打印uint8_t,因为它将它视为ASCII。它需要被输入到例如uint16_t。当我有解决方案时,我会在这里发布。

+0

你所有的警告和调试信息(编译'GCC -std = C++ 11 - 墙-g')?你使用了调试器('gdb')吗? – 2014-10-06 11:08:44

+0

是的,我拥有所有这些标志。 – user1876942 2014-10-06 11:13:08

+1

看起来[罚款](http://coliru.stacked-crooked.com/a/3cb5daa3767e0984)给我。 – Columbo 2014-10-06 11:14:53

回答

1

一个很好的例子,使用可变参数模板用的printf可以在这里找到:

http://msdn.microsoft.com/en-us/library/dn439779.aspx

void print() { 
    cout << endl; 
} 

template <typename T> void print(const T& t) { 
    cout << t << endl; 
} 

template <typename First, typename... Rest> void print(const First& first, const Rest&... rest) { 
    cout << first << ", "; 
    print(rest...); // recursive call using pack expansion syntax 
} 

int main() 
{ 
    print(); // calls first overload, outputting only a newline 
    print(1); // calls second overload 

    // these call the third overload, the variadic template, 
    // which uses recursion as needed. 
    print(10, 20); 
    print(100, 200, 300); 
    print("first", 2, "third", 3.14159); 
} 
+0

只有链接的答案不是很好;链接腐烂。尽量至少总结文章。 – 2014-10-06 12:27:17

+0

谢谢,我添加了代码片段 – 2014-10-06 13:30:20