【发布时间】:2015-08-10 14:20:07
【问题描述】:
我正在写一个pair 包装器。就这个问题而言,它可以简化为:
using namespace std;
template <class T1, class T2>
class myPair {
pair<T1, T2> member;
public:
myPair() = default;
myPair(T1 x, T2 y) : member(make_pair(x, y)) {}
};
我希望能够将myPair 视为大小为2 的可索引容器。为此,我显然需要为myPair 编写索引运算符。我想做这样的事情,但是我的返回类型将取决于方法参数,并且我不能在元编程中使用方法参数。
auto myPair::operator[](int index) {
static_assert(index >= 0 && index < 2, "Index out of range");
return get<index>(*this);
}
显然,我可以像pair 一样通过提供get 函数来解决这个问题,但我希望能够使用索引运算符语法。有什么方法可以专门化函数模板或使用方法参数对模板的返回类型进行元编程?
【问题讨论】:
-
std::get有什么问题? -
@CoffeeandCode
get没有什么问题,但这意味着一个pair不能像另一个容器一样被索引。 -
@JonathanMee
pairs和tuples在 C++StdLib 的概念意义上不是容器。大写 C Container 是同构容器,即它的所有元素都具有相同的类型。从语法上讲,您到底想达到什么目的? (包括您希望如何使用返回值。) -
有 3 种方法可以解决这个问题。首先,延续传递风格(你采取延续,并将返回值传递给它)。其次,返回一个多态的可访问值(如
boost::variant),类似。最后,将索引存储在参数的类型中。它们都不是您想要的:运行时值不能用于更改 C++ 中表达式的静态类型,静态类型是编译时已知的(子集)。 -
@dyp 我正在尝试通过调用
get来实现相同的目标,但是myPair将被传递到模板化函数中,因此我需要它的行为与其他函数一样索引可访问的容器。模板化函数将仅访问容器的一个元素。将此结果分配给const auto变量并处理该变量。模板化函数在get上工作得很好,只是我必须专门化它,我不想这样做。
标签: c++ templates indexing return-type std-pair