如果你看一下main,你会发现我可以用4,t2(或t)调用write,但不能在同一个调用中调用它们,为什么?除了把他们分成几个电话,我还能做些什么吗?
template<class T>
struct Test
{
T data;
constexpr Test()=default;
Test(Test&)=delete;
void Write() { }
template<typename...Args>
void Write(unsigned int v, Args...args) {
Write(args...);
}
template<typename...Args>
void Write(int v, Args...args) {
Write(args...);
}
template<typename...Args>
void Write(char v, Args...args) {
Write(args...);
}
template<typename...Args>
void Write(const Test<char>&v, Args...args) { Write(args...); }
};
int main()
{
Test<char> t;
const Test<char>&t2=t;
t.Write(4); //ok
t.Write(t2);//ok
t.Write(0, t2); //not ok
}
由于您已经删除了复制构造函数,最后一行将无法工作。修复它的一种方法是传递可变参数作为引用,如:
#include <iostream>
template<class T>
struct Test
{
T data;
constexpr Test()=default;
Test(Test&)=delete;
void Write() { }
template<typename...Args>
void Write(unsigned int v, Args&...args) {
Write(args...);
}
template<typename...Args>
void Write(int v, Args&...args) {
Write(args...);
}
template<typename...Args>
void Write(char v, Args&...args) {
Write(args...);
}
template<typename...Args>
void Write(const Test<char>&v, Args&...args) { Write(args...); }
};
int main()
{
Test<char> t;
const Test<char>&t2=t;
t.Write(4); //ok
t.Write(t2);//ok
t.Write(0, t2); //ok
}