字符串文字(const char [])和const char *之间的函数模板特化

时间:2015-03-03 03:40:21

标签: c++ templates variadic-templates

我希望有一个可变函数f(p1,p2,...) memcpy()逐个va_list,va_start,...到目的地的每个参数。为了节省运行时开销,我更喜欢strlen()上的可变参数函数模板。假设参数是基本数据类型(int,double等)或C-string。正如您所料,需要仔细处理C字符串参数。我需要void f() { } // template #1 template<typename T, typename... Args> void f(T t, Args... args) { cout << "in f(T t, Args... args)" << endl; f(args...); } //template #2 template<typename... Args> void f(const char* t, Args... args) { cout << "in f(const char* t, Args... args)" << endl; f(args...); } 来获取C字符串的长度才能正确复制。请考虑以下代码。

int x = 3; f(x); 
f("hello");
const char* p = "world"; f(p);
string s = "stack"; f(s.c_str());

适用于

f("hello")

但对于像f()这样的来电,我希望我的strlen(p)能够聪明地说出来,#哈哈,我知道&#34;你好&#34;是一个字符串文字,const char _some_name_ [6]。我打电话给// template #3 template<uint8_t N, typename... Args> void f(const char (&s)[N], Args... args) { cout << "in f(const char (&s)[N], Args... args)" << endl; f(args...); } 来告诉我长度不是那么愚蠢。&#34;所以我添加以下模板专业化。

f("hello")

使用这三个模板(#1,#2和#3),编译器(clang ++)抱怨/* t4.cpp:30:5: error: call to 'f' is ambiguous f("hello"); ^ t4.cpp:16:6: note: candidate function [with Args = <>] void f(const char* t, Args... args) { ^ t4.cpp:22:6: note: candidate function [with N = '\x06', Args = <>] void f(const char (&s)[N], Args... args) { ^ t4.cpp:10:6: note: candidate function [with T = const char *, Args = <>] void f(T t, Args... args) { ^ */ 的含糊不清

f()

问题:如何使{{1}}足够聪明以区分字符串文字(或const char [])和char *?

0 个答案:

没有答案