gpt4 book ai didi

c++ - 模板推导和函数指针

转载 作者:行者123 更新时间:2023-11-30 03:11:44 26 4
gpt4 key购买 nike

编译器如何知道这段代码的正确类型:

class Base
{
protected:
typedef View * ViewType;
typedef boost::function<ViewType ()> ActionType;
typedef boost::unordered_map<std::string, ActionType> ActionMapType;

ActionMapType actions;

template <class ControllerType>
inline void addAction(std::string actionName, ViewType (ControllerType::*action)()) { actions.insert(ActionMapType::value_type(actionName, bind<ViewType>(&action, static_cast<ControllerType *>(this)))); }
};

class Derived : public Base
{
Derived()
{
addAction("someAction", &Derived::foo); // No template
}

ViewType foo() { cout << "foo"; }
}

我知道我将 Derived 作为 ControllerType 传递,但编译器如何确定 Derived 是模板参数?

最佳答案

模板参数是 ControllerType,它在函数参数列表中用作 ViewType (ControllerType::*action)() 参数。当您提供 ViewType (Derived::*)() 类型的实际参数时,编译器会立即意识到 ControllerType = Derived。就是这样。这称为模板参数推导。

在 C++ 的某些上下文中,编译器无法从函数参数的类型中推断出模板参数。此类上下文称为非推导上下文。语言规范提供了一个非推导上下文的列表。而你的不是其中之一。

关于c++ - 模板推导和函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2068969/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com