我希望有一个可变函数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 *?