【问题标题】:C++ Array Subscript Operator TemplateC++ 数组下标运算符模板
【发布时间】:2012-04-15 00:31:21
【问题描述】:

在尝试让访问存储类变得更容易一些之后,我最终陷入了一种我没有太多知识的情况。而且,要找到和我做同样事情的人并不容易。

我想要做的是有一个类,它在内部将值数组存储为字符串,但允许从用户端进行简单的类型转换。我计划做的是使用数组下标运算符返回他们通过模板指定的任何类型。虽然,这听起来比实际工作要好得多。这是我正在做的一个简单示例,让您了解它应该如何工作。

class StringList
{
    public:
    template <typename T> 
    T operator[](const int i)
}

从那里,我会定义一些特定的模板,如果需要,任何用户都可以很容易地定义更多。但是,最大的问题是,我不知道如何用模板调用下标运算符。起初我假设以下(这显然是不正确的),考虑到它类似于调用模板方法的标准方式。

StringList list;
T var = list<T>[0];

有谁知道将下标运算符作为模板调用的正确方法?或者,我应该避免这样做,而是使用命名方法吗?

【问题讨论】:

  • 我会警告不要为此重载operator[],因为重载运算符最适合在语法上有意义时使用。你通常不会写像list&lt;T&gt;[0] 这样的东西,我认为额外的智力开销是不值得的。为什么不直接制作一个模板get 方法并调用list.get&lt;int&gt;(0)
  • @templatetypedef 我完全同意。考虑到我什至不明白你会如何编写这样的模板,我很可能会坚持使用像 get 这样的命名函数。但是,我很想知道它是如何编写的,无论我是否需要使用它。

标签: c++ templates operator-overloading metaprogramming


【解决方案1】:

调用操作员的唯一方法是显式写入list.operator[]&lt;T&gt;()

有两种基本的出路:

  1. 写一个类似list.get&lt;int&gt;()的函数模板(由templatetypedef提议)
  2. 将自动对话的代理返回给T

代码如下:

// in the class
struct proxy {
  proxy(StringList *list, int i) : list(list), i(i) {}
  StringList *list;
  int i;
  template <typename T>
  operator T() { return list->get<T>(i); }
};

proxy operator[](int i) { return proxy(this, i); }

template <typename T> 
T get(int i) { return ...; T(); }

// how to use it:
StringList list;
int var = list.get<int>(0);
float var2 = list[0];

【讨论】:

  • 我必须承认我不太了解您的基于代理的解决方案。你介意详细说明一下吗? T get(int i) { return ...; T(); } 的目的是什么? proxy operator[](int i) { return proxy(this, i); }StringList 有什么关系? float var2 = list[0]; 行是如何工作的?不过,我对高级 C++ 技术知之甚少可能是这里的原因。 :-)
【解决方案2】:

我认为没有语法可以将模板参数传递给 operator[] 的自然调用。您可能需要致电:

T var = list.operator[]<T>(0);

就像你对普通模板函数所做的那样,在这里使用运算符重载是没有意义的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    • 2012-07-16
    • 1970-01-01
    • 2012-07-06
    • 2012-09-29
    相关资源
    最近更新 更多