如何通过函数调用运算符将对象实例用作函数?代码实现解析
如何实现你的
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; }
编译运行步骤
- 把上面的代码保存为
temp_demo.cpp - 用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
- Linux/macOS终端:
- 运行程序:
- Linux/macOS:
./temp_demo - Windows:
temp_demo.exe
你会看到控制台输出3。
- Linux/macOS:
关键细节解释
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
相关产品推荐
相关产品推荐

