我一直在努力简化我的一些代码,尽可能地缩小和调用电话。我一直试图做的事情之一是将我在这个地方的两个常见重载融合为一个。它们如下:
void MyClass::addSomething(Something & a)
{
vectorOfSomething.push_back(&a)
}
void MyClass::addSomething(std::vector<Something*> a)
{
for (unsigned int i = 0; i < a.size(); i++)
vectorOfSomething.push_back(a[i]);
}
类Something是抽象的。 vectorOfSomething是指向Somethings的指针向量。
基本上,不必这样做:
std::Vector mySomethings = {&something1, &something2};
addSomething(mySomethings);
我想这样做:
addSomething({something1, something2});
因此它更类似于第一次重载(用户不需要首先创建指针向量)。环顾我看到的两种方式是通过:std :: initializer_list或可变参数模板,我不怕承认对我来说都是完全陌生的。
我已经用初始化列表给了它一个镜头但是在尝试各种各样的事情时遇到了很多错误。我已经设法让函数实际接受列表,但我无法弄清楚如何正确填充向量。主要问题似乎是init列表中的值为'const'。
如果有人知道如何完成这项工作,我将不胜感激!
答案 0 :(得分:0)
这样的事情:
#include <iostream>
#include <initializer_list>
#include <vector>
#include <list>
struct MyClass {
template <typename It >
void Add( It b, It e ) {
data_.insert( end(data_), b, e );
}
void Add( std::initializer_list<int> const & elems ) {
Add( begin(elems), end(elems) );
}
template <typename T>
void Add( T const & cont ) {
Add( begin(cont), end(cont) );
}
std::vector<int> data_;
friend std::ostream & operator<<( std::ostream & os, MyClass const & mc ) {
for( auto & e : mc.data_ )
os << e << " ";
return os;
}
};
int main() {
MyClass foo;
foo.Add( { 1, 3 });
std::vector<int> v { 1,2};
foo.Add( v );
std::list<int> l { 4,5};
foo.Add( l );
std::cout << foo;
}
编译器无法推断出initializer_list的模板参数,专业化必须是显式的。