lea*_*vst 9 c++ arrays templates vector c++11
我有一个函数,目前接受2个可以包含任何普通旧数据的向量...
template <class T>
void addData(const vector<T>& yData, vector<T> xData)
{ .. }
Run Code Online (Sandbox Code Playgroud)
题:
std::array或两个std::vector,甚至是它们的组合?当然,这只是创造一个合适的类型特征的问题.该示例仅使用f()具有一个参数的函数,但扩展以获取任意数量的参数是微不足道的.
#include <array>
#include <vector>
#include <deque>
#include <utility>
#include <cstddef>
template <typename T>
struct is_array_or_vector {
enum { value = false };
};
template <typename T, typename A>
struct is_array_or_vector<std::vector<T, A>> {
enum { value = true };
};
template <typename T, std::size_t N>
struct is_array_or_vector<std::array<T, N>> {
enum { value = true };
};
template <typename T>
typename std::enable_if<is_array_or_vector<T>::value>::type
f(T const&)
{
}
int main()
{
f(std::vector<int>()); // OK
f(std::array<int, 17>()); // OK
f(std::deque<int>()); // ERROR
}
Run Code Online (Sandbox Code Playgroud)
为什么不使用它,它适用于任何使用随机访问迭代器的容器,包括普通的旧数组.如果您可以使用迭代而不是索引,那么您也可以取消随机访问要求.
template <typename Cnt1, typename Cnt2>
void addData(const Cnt1& yData, Cnt2 xData) // is pass-by-value intended?
{
using std::begin;
using std::end;
typedef decltype(*begin(yData)) T;
const auto sizeY = end(yData) - begin(yData);
const auto sizeX = end(xData) - begin(xData);
// ...
}
Run Code Online (Sandbox Code Playgroud)
C++ 03版本(不支持普通旧数组):
template <typename Cnt1, typename Cnt2>
void addData(const Cnt1& yData, Cnt2 xData) // is pass-by-value intended?
{
typedef Cnt1::value_type T;
const size_t sizeY = yData.end() - yData.begin();
const size_t sizeX = xData.end() - xData.begin();
// ...
}
Run Code Online (Sandbox Code Playgroud)