簡體   English   中英

C ++:從struct中的靜態函數提取參數類型

[英]C++: Extracting parameter type from static function in struct

說我有這樣的事情:

template<typename T, typename R>
struct MyStruct {
    static R myfunc(T);
};

struct MyStructInst: S<int, double> {
    static double myfunc(int i) { return i; }
};

然后,稍后,我得到一個帶有M的模板,我將假定該類型具有帶有一個參數的靜態myfunc函數(例如MyStructInst )。 我想提取myfunc的參數類型和結果類型:

template<typename M,
    typename ParamType = ???,
    typename ResultType = decltype(declval(M::myfunc))> // I think this works?
struct MyStruct2 {
    ...
};

獲取ParamType的最簡單方法是什么?

關於什么

template <typename R, typename A0, typename ... As>
constexpr A0 firstArg (R(*)(A0, As...));

template <typename M,
          typename PT = decltype(firstArg(&M::myfunc)),
          typename RT = decltype(M::myfunc(std::declval<PT>()))>
struct MyStruct2 
 { };

我的意思是...如果您聲明(無需實現它,因為僅在decltype()內部使用,因此僅返回的類型很重要)一個接收函數類型的函數(我記得指向靜態對象的指針方法就像指向傳統函數的指針一樣),該方法接收一個或多個參數並返回第一個參數的類型

template <typename R, typename A0, typename ... As>
constexpr A0 firstArg (R(*)(A0, As...));

給定模板類型名稱M ,您可以使用以下方法獲取myFunc()方法的第一個參數(如果有):

typename PT = decltype(firstArg(&M::myfunc))

給定PT (第一個類型參數的類型),您可以簡單地模擬(在decltype() ,使用std::declval() )使用類型為PT的對象對myfunc()進行調用,從而獲得返回的類型。

typename RT = decltype(M::myfunc(std::declval<PT>()))

以下是完整的編譯示例

#include <string>
#include <type_traits>

template <typename T, typename R>
struct MyStruct
 { static R myfunc(T); };

struct MyStructInst 
 { static double myfunc(int i) { return i; } };

template <typename R, typename A0, typename ... As>
constexpr A0 firstArg (R(*)(A0, As...));

template <typename M,
          typename PT = decltype(firstArg(&M::myfunc)),
          typename RT = decltype(M::myfunc(std::declval<PT>()))>
struct MyStruct2 
 { using type1 = PT; using type2 = RT; };

int main ()
 {
   static_assert( std::is_same<int,
      typename MyStruct2<MyStructInst>::type1>{}, "!");
   static_assert( std::is_same<double,
      typename MyStruct2<MyStructInst>::type2>{}, "!");
   static_assert( std::is_same<long,
      typename MyStruct2<MyStruct<long, std::string>>::type1>{}, "!");
   static_assert( std::is_same<std::string,
      typename MyStruct2<MyStruct<long, std::string>>::type2>{}, "!");
 }

暫無
暫無

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

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