尝试漂亮打印函数签名时,常量限定符在可变参数模板参数上丢失[重复]

问题描述 投票:0回答:1

我希望使用具有类型特征的模板编程来漂亮地打印函数的签名。虽然我提出的要点有效,但函数参数上的 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;
}
c++ templates variadic-templates type-traits parameter-pack
1个回答
0
投票

欢迎使用旧功能。

const A(int [7])
和类似的函数签名都是谎言。 C++ 从实际签名中删除了顶级常量和顶级数组大小等。

在主体中,您可以声明它们

cininst
并在内部强制执行它,但是
void foo(int)
void foo(int const)
就 C++ 而言是相同的重载。

这就是

std::result_of
被重写的原因之一;类型到处都会转换。

© www.soinside.com 2019 - 2024. All rights reserved.