【问题标题】:c++ Template [] overloadc++模板[]重载
【发布时间】:2012-07-19 20:41:20
【问题描述】:

我有一个类,它具有括号运算符的模板函数。它可以编译,但我不知道如何访问它。

见下面的例子:

   class Test {
    public:
        template <class T> pServiceState operator[] (const std::string project) {
             return getService<T>(project);
        }

       template <class T> pServiceState getService(const std::string project) {
             pService s = get_service<T>();
             if(s == NULL) throw "Service does not exist on server";
             return s->state(project);
        }

    }

int main(){

    states.getService<content_uploader>("asd"); // Works
    states<content_uploader>["asd"]; // Throws syntax errors.

/*
error: expected primary-expression before ‘>’ token
error: expected primary-expression before ‘[’ token
*/


}

感谢您的帮助, 亚当

【问题讨论】:

  • 你可以试试states.operator[]&lt;content_uploader&gt;("asd"); 我不太确定这是否可行。
  • 第 4 行不需要return getService&lt;T&gt;(project) 吗?
  • 是的,是克莱门特,错字。
  • @chris:确实这是唯一适用的语法

标签: c++ templates


【解决方案1】:

编译器无法从您的案例中的参数派生模板参数T,因此您需要指定它。语法类似于常规函数。所以,试试:states.operator[]&lt;content_uploader&gt;("asd")

例子:

#include <iostream>
#include <vector>

class Foo
{
public:
    Foo() : vec(5, 1) {}
    template <typename T>
    int operator[](size_t index)
    {
        std::cout << "calling [] with " << index << std::endl;
        return vec[index];
    }
private:
    std::vector<int> vec;
};

int main()
{
    Foo foo;
    foo.operator[]<int>(2);
}

【讨论】:

  • 确实有效。太糟糕了,看起来没有理由使用运算符,因为目标是使代码更具可读性和简洁性。
  • 我建议对整个类 Test 进行模板化,或者将 operator[] 替换为具有适当名称的函数(例如 getServiceState()),这样您就可以调用 getServiceState() 之类的函数 - 指定常规函数的模板参数不被认为是不好的样式
  • 这在我的情况下没有意义,因为我使用模板函数来检查类列表中可能存在的类类型。
  • 我确实使用了这个函数,但由于底层数据类型是一个映射,我想传递相同的结构。
猜你喜欢
  • 2010-09-18
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多