簡體   English   中英

如何將各種類型的函數作為容器進行管理

[英]How to manage various types of functions as containers

我正在嘗試通過 c++ 模板管理 function 列表。

template<typename T, typename... Args>
std::map<std::wstring, std::function<T(Args...)>> mFuncs;

上面的代碼不是正確的句子,但是就像上面的代碼概念一樣,我想將各種類型的函數作為一個列表來管理。

void RegisterFuncs()
{
   mFuncs.emplace(L"Func1", [&]()->bool{ ... });
   mFuncs.emplace(L"Func2", [&](int a, std::string b)->int{ ... });
   mFuncs.emplace(L"Func3", [&](std::tuple<int,int>& a){ ... });
   ...
   ...
   ...
   mFuncs.emplace(L"Func", [&](args...)->auto{ ... });
}
template<typename... TArgs>
inline auto CallFunc(const wchar_t* pKey, TArgs&&... pArgs)
{
   ...
   ...

   return mFuncs[pKey](std::forward<TArgs>(pArgs)...);
}

如何實現上述概念?

使用std::any

std::map<std::string, std::any> f;
int i = 3;

void RegisterFuncs()
{
    f.emplace("func1", std::function<double(int)>([&](int k){i = k; return 5.0; }));
    f.emplace("func2", std::function<bool()>([](){return false; }));
    //                      ^^^^^^^^^^^^^^^^ cant use lambda type becuase any_cast doesnt support implicit casting
}

template<typename R, typename... Args>
inline R CallFunc(const std::string& name, Args&&... args)
{
    return std::any_cast<std::function<R(Args...)>>(f[name])(args...);
}

int main()
{
    RegisterFuncs();

    double r = CallFunc<double, int>("func1", 6);
    std::cout << "r: " << r << " i: " << i << "\n";

    bool b = CallFunc<bool>("func2");
    std::cout << std::boolalpha << "b: " << b << "\n";

    //types must match exactly or bad_any_cast is thrown
    try
    {
        int c = CallFunc<int>("func2");
        std::cout << "c: " << c << "\n";
    }
    catch(std::bad_any_cast e)
    {
        std::cout << e.what();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM