• C++函数类型以及函数表实验


    C++的函数也有类型。比如:

    void func(int a);
    

    上面的函数的类型是: void(int)

    它可以作为模板类型参数,如同普通的类型一样:

    template<typename T> Foo;
    
    Foo<void(int)> foo;
    

    std::function模板就有类似的用法。

    我做了一个实验,设计一个函数表,但是是用模板的行式。来测试一下这个特殊的类型定义。

    代码如下:

    
    #include <array>
    #include <iostream>
    #include <map>
    
    template<typename FunctionType, size_t MAX_FUNC_TYPE>
    class FunctionMap
    {
    public:
    	bool RegisterFunction(size_t func_type, FunctionType* function)
    	{
    		if (nullptr == function) return false;
    		if (func_type >= MAX_FUNC_TYPE) return false;
    		if (m_function_map[func_type] != nullptr) return false;
    		m_function_map[func_type] = function;
    		return true;
    	}
    
    	template<typename... ParamType>
    	void CallFunction(size_t func_type, ParamType&&... param)
    	{
    		auto f = this->GetFunction(func_type);
    		if (nullptr != f)
    		{
    			f(std::forward<ParamType>(param)...);
    		}
    	}
    
    private:
    	FunctionType* GetFunction(size_t func_type)
    	{
    		if (func_type >= MAX_FUNC_TYPE) return nullptr;
    		return m_function_map[func_type];
    	}
    
    	std::array<FunctionType*, MAX_FUNC_TYPE> m_function_map{};
    };
    
    void Test(int a)
    {
    	std::cout << "Test " << a << std::endl;
    }
    
    int main()
    {
    	enum
    	{
    		FUNC_TYPE_1,
    		FUNC_TYPE_2,
    
    		FUNC_TYPE_MAX,
    	};
    
    	FunctionMap<void(int), FUNC_TYPE_MAX> fm;
    	fm.RegisterFunction(FUNC_TYPE_1, [](int i) { std::cout << "Func1 called " << i << std::endl; });
    	fm.RegisterFunction(FUNC_TYPE_2, [](int i) { std::cout << "Func2 called " << i << std::endl; });
    
    	fm.CallFunction(FUNC_TYPE_1, 42);
    	fm.CallFunction(FUNC_TYPE_2, 43);
    
    	std::cin.get();
    }
    

    函数类型如同数组类型一样,不能直接作为函数参数,需要转换成指针。

    CallFunction 函数这里使用了变长模板参数、万能引用+完美转发惯用法,从而实现了客户端调用接口。

  • 相关阅读:
    DHCP 工作原理
    网络端口知识总结
    EAPOL 协议
    hostapd源代码分析(三):管理帧的收发和处理
    hostapd源代码分析(二):hostapd的工作机制
    hostapd源代码分析(一):网络接口和BSS的初始化
    Hostapd
    事件属性
    CSS颜色和长度单位
    弹性盒子FlexBox简介(一)
  • 原文地址:https://www.cnblogs.com/demon90s/p/15671806.html
Copyright © 2020-2023  润新知