阿发君 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 交替优化波束形成和ris反射角使保密速率最大化
  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程