[英]C++/LabVIEW interop: error extracting data from LabVIEW array/ unexpected type conversion in function parameter
[英]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.