成員函數我想寫一個類test
,其能夠存儲一個函數,其能夠通過由經典[first,last)
迭代器對標識的元素的集合來迭代,即:C++與迭代器作爲參數
template <typename T>
struct sum
{
template <typename I>
T operator()(I first, I last) const
{
T res = 0;
while (first != last)
{
res += *first;
++first;
}
return res;
}
};
//...
int main()
{
test<double> t;
t.set(sum<double>);
double a[] {1.,2.,3.};
std::cout << "Test (array) => " << t.call(a, a+3) << std::endl;
std::vector<double> v {1.,2.,3.};
std::cout << "Test (vector) => " << t.call(v.begin(), v.end()) << std::endl;
std::list<double> l {1.,2.,3.};
std::cout << "Test (list) => " << t.call(l.begin(), l.end()) << std::endl;
}
我以爲使用std::function
,但我沒有做到這一點,因爲我無法聲明模板化的迭代器對。 可能的解決方法是以下,然而僅使用普通陣列(例如,double[]
或double*
,與上述變量a
),但不與其它容器(例如,像上述變量v
和l
)工作原理:
template <typename T>
class test
{
public:
template <typename F>
void set(F f)
{
f_ = f;
}
template <typename I>
T call(I first, I last) const
{
return f_(first, last);
}
private:
std::function<T(T*,T*)> f_;
};
關於如何獲得正確行爲的任何想法?
注:我用GCC 4.9.2編譯= --std C++ 11
非常感謝你。
我不認爲這是可能的存儲類型擦除仿函數,它有兩個迭代器並返回一個'T'。我能想到實現這一點的唯一方法是需要虛擬模板方法......這是不允許的。 – Barry
我改變了主意:) – Barry
我編輯了你的問題來取出你的答案(它不適合這個問題 - 你可能會單獨發佈它作爲答案)。但是,這也不是一個很好的解決方案,因爲(a)現在你正在施加潛在的巨大運行時間開銷,並且(b)在'T'(它是可複製的)上增加了人爲的需求。 – Barry