在 C++03 中建模初始值设定项列表

Modeling Initializer Lists in C++03

我正在为 C++03 开发元组 class。我希望能够从列表中构造它,这很棘手,因为元组的长度可能会有所不同。

#ifndef N_TUPLE_H
#define N_TUPLE_H


template <typename T, int N>
class N_Tuple
{
 public:
  N_Tuple(T values[N]);
 private:
  T values_[N];
};


template <typename T, int N>
N_Tuple< T, N >::N_Tuple(T values[N])
{
  for (int i = 0; i != N; ++i)
    values_[i] = values[i];
}


#endif

目前,我必须这样做:

int arr[] = { 0, 1, 2 };
N_Tuple< int, 3 > t(arr);

它看起来很笨重而且不太人性化。是否可以在 C++03 中将其缩减为一行?

提前致谢。

如果您有权访问 Boost, you can use Assignment Library

甚至还有关于如何正确使用它的信息here on SO

It seems clunky and not very user-friendly. Is it possible to reduce this to a single line in C++03?

因为你基本上是在模仿std::array,就去掉构造函数:

template <typename T, int N>
class N_Tuple
{
 public:
  T values_[N];
};

注意,在此,你必须values_ public.

这样你就可以像你期望的那样初始化它们:

N_Tuple<int,3> p = {1,2,3};

这在 C++03 和 C++11 中均有效,不需要任何类型的扩展(Tr1、Boost 或其他)。

另一种方法是将助手数组隐藏在宏后面。基本思想是初始化您的助手数组,然后从那里初始化您的元组式数组。但是由于您希望数组的内容在初始化符号 (var x = contents) 之后出现,因此您必须使用类似 prolog-epilog 宏的东西,这将需要一些重复在您的特定类型的情况下,您必须小心使用逗号:

SOME_MACRO_BEGIN(My_Sequence_type, t) = {1, 2, 3} 
SOME_MACRO_END(My_Sequence_type, t);

我有 worked on such a solution 与 C++03 和 C++11 兼容(前提是你确实为 C++11 实现了一个 initializer_list 构造函数),没有任何特别之处C++03 方面的要求。

(我不确定如何在单个宏中完成它,因为元素列表将包含专门为宏处理的逗号,而可变参数宏在 C++ 中不是一个东西03)

但是除非您的列表很短或者您将 prolog-epilog 宏的名称缩写很多,否则它不可能放在一行中。

(此外,它仍然需要 复制 数据,即使对于最简单的类型也无关紧要)