本文介绍了C++ 为可变参数重载运算符逗号的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
是否可以通过重载参数的运算符逗号来构造函数的可变参数?我想看一个例子,如何这样做..,也许是这样的:
is it possible to construct variadic arguments for function by overloading operator comma of the argument? i want to see an example how to do so.., maybe something like this:
template <typename T> class ArgList { public: ArgList(const T& a); ArgList<T>& operator,(const T& a,const T& b); } //declaration void myFunction(ArgList<int> list); //in use: myFunction(1,2,3,4); //or maybe: myFunction(ArgList<int>(1),2,3,4); 推荐答案这是有可能的,但用法看起来不太好.例如:
It is sort-of possible, but the usage won't look very nice. For exxample:
#include <vector> #include <iostream> #include <algorithm> #include <iterator> template <class T> class list_of { std::vector<T> data; public: typedef typename std::vector<T>::const_iterator const_iterator; const_iterator begin() const { return data.begin(); } const_iterator end() const { return data.end(); } list_of& operator, (const T& t) { data.push_back(t); return *this; } }; void print(const list_of<int>& args) { std::copy(args.begin(), args.end(), std::ostream_iterator<int>(std::cout, " ")); } int main() { print( (list_of<int>(), 1, 2, 3, 4, 5) ); }这个缺点将在 C++0x 中修复,您可以这样做:
This shortcoming will be fixed in C++0x where you can do:
void print(const std::initializer_list<int>& args) { std::copy(args.begin(), args.end(), std::ostream_iterator<int>(std::cout, " ")); } int main() { print( {1, 2, 3, 4, 5} ); }甚至混合类型:
template <class T> void print(const T& t) { std::cout << t; } template <class Arg1, class ...ArgN> void print(const Arg1& a1, const ArgN& ...an) { std::cout << a1 << ' '; print(an...); } int main() { print( 1, 2.4, 'u', "hello world" ); }更多推荐
C++ 为可变参数重载运算符逗号
发布评论