【问题标题】:Defining operators to std library classes为 std 库类定义运算符
【发布时间】:2014-09-18 23:28:27
【问题描述】:

我是使用 Visual Studio Express 2012 的 windows 7 用户。使用的编译器是程序附带的编译器。我遇到的具体问题是此版本的 Visual Studio 的向量尚不支持 initializer_list。此外,我似乎在使用 initializer_list 类时遇到了问题。我不确定这是否是由于我自己的无能,但事实仍然是我不能使用 initializer_list 来向量。

但是,即使实现,我也希望具有与 intializer_list 相同的语法。但是,由于我写信给 SO 的主要原因是学习,所以这不是问题。我认为,如果可以为 std 类创建运算符,则可以为向量定义一个类似于 initializer_list 的运算符,所以问题是:

是否可以为 std 库类定义运算符,如果可以,我该怎么做?

我尝试的是创建一个创建长度为 1 的向量的示例:

#include<iostream> //Used for later debugging
#include<vector>
#include<string> // Used later

template<typename T>
std::vector<T> operator {} (T y){
std::vector<T> out;
out.push_back(y);
return out;
};

int main(){
std::vector<int> v = {1};
}

这根本不起作用。事实上,这甚至没有编译。一个工作示例将不胜感激,但操作员对向量执行任何操作的最小示例就足够了。我认为我的主要问题是为已经存在的类定义一个运算符是主要问题。

【问题讨论】:

    标签: c++ initializer-list


    【解决方案1】:

    别忘了。您不能定义要重载的新运算符。只有一堆可以重载。

    第一个谷歌搜索结果:http://www.cprogramming.com/tutorial/operator_overloading.html

    重载可以是:

        +       -       *       /       %       ^       &       |
        ~       !       ,       =              =
        ++      --      <<      >>      ==      !=      &&      ||
        +=      -=      /=      %=      ^=      & =     |=      *=
        <<=     >>=     [ ]     ( )     ->      ->*     new     delete
        new[]   delete[]
    

    你不能超载:

        ?       .*
    

    而且你不能定义一个新的运算符,尤其是不是 {} 运算符。

    【讨论】:

    • 好的,我明白了。这对我来说很伤心,但我想这是一个非常好的理由。这当然是有道理的。
    • 好的,因为不可能像问题中那样创建运算符,我想我需要接受这个答案并发布一个更具体的问题。还是谢谢你。
    猜你喜欢
    • 2023-03-21
    • 2021-05-13
    • 2021-06-11
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    相关资源
    最近更新 更多