我希望使用具有类型特征的模板编程来漂亮地打印函数的签名。虽然我提出的要点有效,但函数参数上的 const 限定符被删除了。我在哪里会失去资格?我可以采取什么措施来防止这种情况发生?
#include <iostream>
#include <type_traits>
template <typename T>
void print_type_info() {
if (std::is_const_v<T>) {
std::cout << "const ";
}
std::cout << typeid(T).name() << std::endl;
}
template <typename... Args>
void print_function_args() {
(print_type_info<Args>(), ...);
}
template <typename Ret, typename... Args>
void print_function_signature(Ret(*)(Args...)) {
print_function_args<Args...>();
}
void my_function(int, const int) {}
int main() {
print_function_signature(my_function); // not ok: print 'i' for both arguments
print_function_args<const int>(); // ok, prints 'const i'
return 0;
}
欢迎使用旧功能。
const A(int [7])
和类似的函数签名都是谎言。 C++ 从实际签名中删除了顶级常量和顶级数组大小等。
在主体中,您可以声明它们
cininst
并在内部强制执行它,但是 void foo(int)
和 void foo(int const)
就 C++ 而言是相同的重载。
这就是
std::result_of
被重写的原因之一;类型到处都会转换。