Grz*_*orz 3 c++ templates traits decltype c++11
我正在学习仅使用 C++11 借用std::true_type
和std::false_type
.
我创建了以下特征:
#include <iostream>
template <typename F>
struct is_farg1: std::false_type {};
template <typename R, typename A>
struct is_farg1<R (*)(A)> : std::true_type {};
Run Code Online (Sandbox Code Playgroud)
现在考虑一个包含上述特征的程序,以及以下代码:
void f(int) {}
int main() {
std::cout << "is_farg1<decltype(f)> : " << is_farg1<decltype(f)>::value << std::endl;
std::cout << "is_farg1<void(*)(int)> : " << is_farg1<void(*)(int)>::value << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它产生以下输出:
is_farg1<decltype(f)> : 0
is_farg1<void(*)(int)> : 1
Run Code Online (Sandbox Code Playgroud)
我的问题:
is_farg1<void(*)(int)>::value
被true
同时is_farg1<decltype(f)>::value
返回false
?decltype(f)
?因为decltype(f)
给出了确切的函数类型(即void(int)
)而不是函数指针类型(即void(*)(int)
)。当decltype
用于实体时,
您可以为函数类型添加另一个特化,如
template <typename R, typename A>
struct is_farg1<R (A)> : std::true_type {};
Run Code Online (Sandbox Code Playgroud)
或者检查类型作为函数指针
is_farg1<decltype(f)*>::value
// ^
// or
is_farg1<decltype(&f)>::value
// ^
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
87 次 |
最近记录: |