阿发君 2022-08-08 16:00 采纳率: 100%
浏览 47
已结题

关于C++模板函数的疑问

关于C++模板函数的疑问,看代码时遇到如下代码,无法理解:

template<typename B, typename... Args>
class RegisterFactoty : public NoCopyable {
public:
    using CreatorFunc = std::function<std::shared_ptr<B>(Args...)>;
    static RegisterFactoty& Instance()
    {
        static RegisterFactoty r;
        return r;
    }

    template<typename T, typename std::enable_if_t<std::is_base_of_v<B, T>>* = nullptr>
    std::string DoRegister(const std::vector<std::string>& names, CreatorFunc f)
    {
        std::string result;
        for (const auto& it : names) {
            result += it;
            builder_.emplace(it, f);
        }
        return result;
    }

    std::shared_ptr<B> CreateShared(const std::string& name, Args... args)
    {
        std::shared_ptr<B> result = nullptr;
        for (auto&& [n, builder] : builder_) {
            if (n == name) {
                result = builder(std::forward<Args>(args)...);
                break;
            }
        }
        return result;
    }
    RegisterFactoty() = default;
    ~RegisterFactoty() = default;
private:
    std::unordered_map<std::string, CreatorFunc> builder_;
};

其中的模板函数是什么意思?如下:

template<typename T, typename std::enable_if_t<std::is_base_of_v<B, T>>* = nullptr>
    std::string DoRegister(const std::vector<std::string>& names, CreatorFunc f)
  • 写回答

1条回答 默认 最新

  • flower980323 2022-08-08 16:35
    关注

    首先搜一下std::is_base_of_vhttps://www.apiref.com/cpp-zh/cpp/types/is_base_of.html,可以知道只有T继承自B,其value才为true
    然后看一下std::enable_if_t

    template<bool _Test,
        class _Ty = void>
        struct enable_if
        {    // type is undefined for assumed !_Test
        };
    
    template<class _Ty>
        struct enable_if<true, _Ty>
        {    // type is _Ty for _Test
        typedef _Ty type;
        };
    

    其只有在第一个参数为true时,其type才能得到类型,在false的时候type没有定义
    所以这段话的意思是在编译期判断T是否是B的子类,如不是其子类,enable_if的第一个模板参数为false,type没有定义就会报错

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 8月17日
  • 已采纳回答 8月9日
  • 修改了问题 8月8日
  • 创建了问题 8月8日

悬赏问题

  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么