我試圖從函式指標中獲取引數型別
這應該是作業的最終產品
std::function<void(TestAppObject*, MemberFuncArgs<decltype(&TestAppObject::TestMethod)>::InputArgs)> func = &TestAppObject::TestMethod;
當前的 MemberFuncArgs 類
template<typename T>
struct MemberFuncArgs;
template<typename RT, typename Owner, typename ...Args>
struct MemberFuncArgs<RT(Owner::*)(Args...)>
{
static const size_t ArgCount = sizeof...(Args);
typedef RT ReturnType;
typedef Args InputArgs;
};
編譯器拋出錯誤'Args': parameter pack must be expanded in this context。
我只需要一種Args...從函式指標中提取型別的方法,它可能只是一個語法問題,我太笨了,看不到......
uj5u.com熱心網友回復:
編譯器說你不能定義單一型別InputArgs
typedef Args InputArgs;
鑒于這Args是一個可變引數串列。
也許您可以基于元組定義型別
using InArgsTuple = std::tuple<Args...>;
Args...所以你可以提取使用中的單一型別std::tuple_element
因此,通過一些模板元編程,您應該能夠撰寫如下內容
using TplT = MemberFuncArgs<decltype(&TestAppObject::TestMethod)>::InArgsTuple;
std::function<void(TestAppObject*, typename std::tuple_element<Is, TplT>::type ...)>
func = &TestAppObject::TestMethod;
假設這Is...是從零到 的模板整數值的可變引數序列sizeof...(Args)-1。
下面是一個完整的 C 20 編譯示例
#include <tuple>
#include <functional>
struct TestAppObject
{
int TestMethod (char, short, int, long, long long)
{ return 0; }
};
template <typename T>
struct MemberFuncArgs;
template <typename RT, typename Owner, typename ... Args>
struct MemberFuncArgs<RT(Owner::*)(Args...)>
{
static constexpr std::size_t ArgCount = sizeof...(Args);
using ReturnType = RT;
using InArgsTuple = std::tuple<Args...>;
};
int main()
{
using MFA = MemberFuncArgs<decltype(&TestAppObject::TestMethod)>;
using FunT = decltype([]<std::size_t ... Is>(std::index_sequence<Is...>)
-> std::function<void(TestAppObject*,
typename std::tuple_element<Is, MFA::InArgsTuple>::type ...)>
{ return {}; }
(std::make_index_sequence<MFA::ArgCount>{}));
FunT func = &TestAppObject::TestMethod;
}
如果您不能使用 C 20(因此在未評估的背景關系中沒有模板 lambda 和 lambda),您可以用傳統模板函式替換 lambda,僅宣告(因為僅在decltype().
以下是完整編譯的 C 14/C 17 示例。#包括 #包括
struct TestAppObject
{
int TestMethod (char, short, int, long, long long)
{ return 0; }
};
template <typename T>
struct MemberFuncArgs;
template <typename RT, typename Owner, typename ... Args>
struct MemberFuncArgs<RT(Owner::*)(Args...)>
{
static constexpr std::size_t ArgCount = sizeof...(Args);
using ReturnType = RT;
using InArgsTuple = std::tuple<Args...>;
};
template <typename MFA, std::size_t ... Is>
std::function<void(TestAppObject*,
typename std::tuple_element<Is, typename MFA::InArgsTuple>::type ...)>
extra_function (std::index_sequence<Is...>);
int main()
{
using MFA = MemberFuncArgs<decltype(&TestAppObject::TestMethod)>;
using FunT = decltype(extra_function<MFA>
(std::make_index_sequence<MFA::ArgCount>{}));
FunT func = &TestAppObject::TestMethod;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/424939.html
