c++ - 为具有模板对象的容器类重载 operator[]

标签 c++ templates operator-overloading

首先,我有一个如下所示的模板类:

template <typename T>
class Configurable
{
    public:
    //protected:
        T var_value;
        std::string var_name;
        std::string var_type;

        Configurable()
        : var_value(0), var_name("unnamed"), var_type("undefined")
        {}
        Configurable( T v_value, std::string v_name, std::string v_type )
        : var_value(v_value), var_name(v_name), var_type(v_type)
        {}

        std::string get_name() {return var_name;}
};

我还有一个名为 Config 的容器类,它有几个不同的 Configurable 列表,用于存储 Configurable int、bool 和 float。我想重载 Config 的 [] 运算符,以便它从列表之一返回具有给定名称(无论类型如何)的 Configurable,但这似乎不起作用:

template <typename T>
Configurable<T>& operator[] ( const std::string v_name_arg );

编译器返回“不匹配运算符[]”的错误。所以我的问题是 - 我怎样才能使这项工作?甚至可以使用模板来完成,还是我应该找到一种不同的继承方法?

编辑:对于所有的困惑,我们深表歉意。这是我正在谈论的容器类:

class Config
{
    public:
    //private:
    std::list < Configurable<int>    > list_int;
    std::list < Configurable<float>  > list_float;
    std::list < Configurable<double> > list_double;
    std::list < Configurable<bool>   > list_bool;

    //public:
    Config(){}

    template <typename T>
    Configurable<T>& operator[] ( const std::string &v_name_arg );
};

最佳答案

在没有任何依赖于模板参数的参数的情况下声明模板化operator[] 的问题在于,编译器无法从表单中的调用中确定类型T 配置[“名称”]。 考虑到代码的可读性,一种解决方案是将 operator[] 更改为如下方法:

template <typename T>
Configurable<T>& get ( const std::string v_name_arg );

那么,调用应该这样写:

config.get<int>("name")

此外,考虑通过引用传递字符串 (const std::string&) 以避免不必要的 std::string 拷贝传递给方法/运算符。

关于c++ - 为具有模板对象的容器类重载 operator[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25349660/

相关文章:

c++ - 从函数返回::迭代器不编译

c++11 - 在现代 C++ 中重载算术运算符的 "best"方法是什么?

c++ - Jasper Reports 用 C++ 可能还是很痛苦?

c++ - Mac OS X 和 Linux 中的安全字符串函数

c++ - 将 32 位大端有符号整数转换为有符号小端整数

templates - 如何使用 std::enable_if_t 和 std::is_base_of 来检查 SFINAE 的编译时继承?

C++ : template member addition function

c++ - 小于运算符不能作为成员函数重载

c++ - 重载乘法运算符失败

c++ - 如何重构这个 while 循环以摆脱 "continue"?