我撰寫了一些實用程式來表征函式的回傳型別,如代碼所示。為什么將函式傳遞給特征函式后特征不能作業?感謝您的大力幫助。
template <class>
struct FunctionHelper;
template <class R, class... ArgsT>
struct FunctionHelper<R(ArgsT...)> {
typedef R type;
};
template <class R, class... ArgsT>
struct FunctionHelper<R *(ArgsT...)> {
typedef R type;
};
int sum(int a, int b);
int *sum1(int a, int b);
template <class Func>
void traits(Func func) {
typename FunctionHelper<Func>::type value;
}
int main() {
traits(sum); // Here is error. error C2027: use of undefined type
traits<decltype(sum)>(sum); // Here works fine
FunctionHelper<decltype(sum)>::type value; // Here works fine
}
MSVS 14.1 中的錯誤訊息如下所示
[build] E:\source\cpp\function_traits\main.cpp(17,34): error C2027: use of undefined type 'FunctionHelper<Func>' [E:\source\cpp\function_traits\build\func_traits.vcxproj]
[build] with
[build] [
[build] Func=int (__cdecl *)(int,int)
[build] ]
[build] E:\source\cpp\function_traits\main.cpp(17): message : see declaration of 'FunctionHelper<Func>' [E:\source\cpp\function_traits\build\func_traits.vcxproj]
[build] with
[build] [
[build] Func=int (__cdecl *)(int,int)
[build] ]
[build] E:\source\cpp\function_traits\main.cpp(21): message : see reference to function template instantiation 'void traits<int(__cdecl *)(int,int)>(Func)' being compiled [E:\source\cpp\function_traits\build\func_traits.vcxproj]
[build] with
[build] [
[build] Func=int (__cdecl *)(int,int)
[build] ]
[build] E:\source\cpp\function_traits\main.cpp(17,1): error C2065: 'type': undeclared identifier [E:\source\cpp\function_traits\build\func_traits.vcxproj]
[build] E:\source\cpp\function_traits\main.cpp(17,39): error C2146: syntax error: missing ';' before identifier 'value' [E:\source\cpp\function_traits\build\func_traits.vcxproj]
[build] E:\source\cpp\function_traits\main.cpp(17,39): error C2065: 'value': undeclared identifier [E:\source\cpp\function_traits\build\func_traits.vcxproj]
uj5u.com熱心網友回復:
如評論中所述,
template <class R, class... ArgsT>
struct FunctionHelper<R *(ArgsT...)> {
typedef R type;
};
專門FunctionHelper用于回傳指標的函式,而不是函式指標。
至于
traits(sum); // Here is error. error C2027: use of undefined type
我建議你看看Template argument deduction。
由于您的引數func不是參考型別,因此:
template <class Func>
void traits(Func func) {
typename FunctionHelper<Func>::type value;
}
以下規則適用:
在扣除開始之前,對P和A進行以下調整:
如果P不是參考型別,
一種。[...]
灣。否則,如果A是函式型別,則將A替換為函式到指標轉換得到的指標型別;
template<class T>
void f(T);
// ...
void b(int);
f(b); // P = T, A = void(int), adjusted to void(*)(int): deduced T = void(*)(int)
因此,您的Func型別被推斷為int(*)(int,int)并且編譯失敗,因為函式指標沒有專門化FunctionHelper。
traits您可以通過更改為來獲得您期望的行為
template <class Func>
void traits(Func const& func) {
typename FunctionHelper<Func>::type value;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/467069.html
