You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过函数调用运算符将对象实例用作函数?代码实现解析

如何实现你的Temp类并运行代码?

嘿,我来帮你搞懂这个问题!你这段代码的核心是要在Temp模板类里重载函数调用运算符,这样类的实例才能像函数一样被调用,同时还要支持赋值操作和引用的使用。我给你一步步拆解:

首先,修正代码里的小笔误

你写的Temp<int> & instref = m;里的m应该是inst,否则编译器会报错(m未定义),修正后这行代码是Temp<int> & instref = inst;。

核心:重载函数调用运算符operator()

在C++中,只要在类里重载operator(),类的对象就可以像普通函数那样被调用(这就是所谓的“函数对象”或“仿函数”)。为了支持inst(1,1)=3这种赋值操作,我们需要让这个运算符返回可修改的左值(即引用);同时还要提供const版本,供const对象或引用使用。

完整的Temp类实现 + 运行代码

这里我用std::map来存储(x,y)坐标对应的值,同时支持默认值初始化:

#include <iostream>
#include <map>
#include <utility>

template<typename T>
class Temp {
private:
    // 用map存储(x,y)到T值的映射
    std::map<std::pair<int, int>, T> data_;
    // 当访问未设置过的坐标时,使用这个默认值
    T default_val_;

public:
    // 构造函数:传入默认值
    explicit Temp(T default_val) : default_val_(std::move(default_val)) {}

    // 非const版本:返回引用,支持赋值操作
    T& operator()(int x, int y) {
        // 如果坐标不存在,插入默认值并返回引用
        auto [iter, is_inserted] = data_.try_emplace(std::make_pair(x, y), default_val_);
        return iter->second;
    }

    // const版本:供const对象/引用调用,返回const引用
    const T& operator()(int x, int y) const {
        auto iter = data_.find(std::make_pair(x, y));
        if (iter != data_.end()) {
            return iter->second;
        }
        // 坐标不存在时返回默认值
        return default_val_;
    }
};

int main() {
    Temp<int> inst(3);       // 创建实例,默认值为3
    inst(1, 1) = 3;          // 调用operator()返回引用,给(1,1)位置赋值3
    Temp<int>& instref = inst;// 创建实例的引用
    std::cout << instref(1, 1) << std::endl; // 通过引用调用,输出3
    return 0;
}

编译运行步骤

  1. 把上面的代码保存为temp_demo.cpp
  2. 用C++编译器编译:
    • Linux/macOS终端:g++ temp_demo.cpp -o temp_demo -std=c++17(需要C++17及以上,因为用到了try_emplace的结构化绑定)
    • Windows(比如MinGW):g++ temp_demo.cpp -o temp_demo.exe -std=c++17
  3. 运行程序:
    • Linux/macOS:./temp_demo
    • Windows:temp_demo.exe
      你会看到控制台输出3。

关键细节解释

  • operator()(int x, int y):这就是让对象能像函数一样被调用的核心重载,非const版本返回T&,所以可以对返回值直接赋值(比如inst(1,1)=3)。
  • try_emplace:用来高效插入键值对,如果键已经存在就不插入,直接返回对应的迭代器,这样我们能确保每次调用都能拿到对应坐标的引用。
  • const版本的operator():当你用const引用(比如const Temp<int>& ref = inst)调用时,这个版本会被触发,保证const对象的只读性。

内容的提问来源于stack exchange,提问作者Declan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:27:04