2012-03-31 63 views
8

在试图让访问存储类更容易一点之后,我最终陷入了一种我没有太多知识的情况。而且,找到那些试图与我做同样事情的人并不容易。C++数组下标操作模板

我想要做的是有一个类在内部存储字符串值作为字符串,但允许从用户端简单的类型转换。我计划做的是使用数组下标运算符通过模板返回它们指定的类型。虽然,这听起来比它在实践中的作用好很多。下面是我正在做的一个简单的例子,让你知道它应该如何工作。

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

从那里,我会定义一些特定的模板,如果需要任何用户可以很容易地定义更多。但是,最大的问题是,我不知道如何用模板调用下标操作符。起初我假定以下(显然不正确),因为它与调用模板方法的标准方式相似。

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

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

+0

为了达到这个目的,我会提醒注意不要重载'operator []',因为重载操作符最适合用于语法上有意义的操作。你通常不会写'list [0]'这样的东西,我认为额外的智力开销并不值得。为什么不制作一个模板'get'方法并调用'list.get (0)'? – templatetypedef 2012-03-31 17:12:40

+0

@templatetypedef我完全同意。考虑到我甚至不知道你会如何编写这样的模板,我很可能会坚持一个像get这样的命名函数。但是,我很想知道它是如何写的,无论我是否需要使用它。 – TheCodeBroski 2012-03-31 17:18:31

回答

10

调用您的操作员的唯一方法是明确写入list.operator[]<T>()

有两个基本的出路:

  1. 写像list.get<int>()函数模板(如提出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]; 
+1

我必须承认我不太了解您的基于代理的解决方案。你介意详细介绍一下吗? T get(int i){return ...;)的目的是什么? T(); }'? 'proxy operator [](int i){return proxy(this,i); }'与'StringList'有关? float'var2 = list [0];'工作如何?我对先进的C++技术知之甚少,可能是这里的原因。 :-) – 2014-08-07 09:46:06

4

我觉得没有语法通过模板参数对operator []的自然召唤。你可能会需要调用:

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

就像你用正常的模板函数做的,所以在这里使用操作符重载是没有意义的。