#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <deque>
#include <functional>
#define BEGIN_TO_END(container) container.begin(), container.end()
template <template<typename...> class OutputContainerType, class InContainer>
OutputContainerType<typename InContainer::value_type> convertContainer(const InContainer& in)
{
OutputContainerType<typename InContainer::value_type> result;
std::transform(BEGIN_TO_END(in), std::back_inserter(result), [](typename InContainer::value_type value) {return value;});
return result;
}
int main() {
std::deque<int> d {1, 2, 3};
const auto v = convertContainer<std::vector>(d);
std::cout << v.size() << std::endl;
}
GCC (link) ile iyi çalışır aşağıdaki kod başarısız olur. Ancak, MSVC 2013 (12.0) ile hata: 'std::vector' : class has no constructors
(here test edilebilir, 12.0 derleyici sürümü seçin) ile derleme. Burada sorun nedir ve nasıl düzeltebilirim?
Sorun değil. Sadece bu MSVC, her zamanki gibi, bu durumda hata vardır. – Nawaz
@Nawaz: Şablon şablonu parametresi kadar basit bir şeyin derleyici testlerinin kapsamına girmeyeceğine inanmak zor. Yoksa std :: vector' nasıl tanımlanır? .. –
Btw. BEGIN_TO_END, Boost.Range tarafından çözülebilir: http://www.boost.org/doc/libs/1_57_0/libs/range/doc/html/range/reference/algorithms/mutating/transform.html. Makro kullanmak iyi bir stil değildir. – sfrehse