有时候,代码中会出现复杂的表达式。例如,密集使用Boost库会吸引这些表达式。如果我想typedef
这些表达式的类型,我需要写出它的类型。有没有办法在编译时知道这种类型( 编辑: 或运行时)?也许,Boost提供适当的功能。我想用它来
#pragma message (...expression...)
编辑: 如果编译时类型检测出现问题,则运行时类型检测也适合。例如,以下功能适合
template <typename T> std::string detectExpressionType(T t);
答案 0 :(得分:2)
在C ++ 03中你可以使用模板参数推导:
template<typename T>
void foo(T x)
{
// Now you have the type of the expression.
}
int main()
{
foo(1.0f * 2.0f);
}
您不能将此用于#pragma message (...expression...)
情况,因为#pragma
是预处理程序指令。您无法在预处理器阶段使用任何类型信息。
答案 1 :(得分:1)
如果需要它进行调试 - 让它失败。如果运行时信息足够好,您可以对类型进行解码(在demangle下面是gcc)。
#include <iostream>
#include <iostream>
#include <typeinfo>
#include <cxxabi.h>
template <typename T> struct DebugType;
template <typename T>
inline void debug_type() {
DebugType<T>();
}
template <typename T>
inline void debug_type(const T&) {
DebugType<T>();
}
std::string demangle(const std::string& source_name)
{
std::string result;
size_t size = 4096;
// __cxa_demangle may realloc()
char* name = static_cast<char*>(malloc(size));
try {
int status;
char* demangle = abi::__cxa_demangle(source_name.c_str(), name, &size, &status);
if(demangle) result = demangle;
else result = source_name;
}
catch(...) {}
free(name);
return result;
}
template <typename T>
inline void log_type() {
std::clog << demangle(typeid(T).name()) << '\n';
}
template <typename T>
inline void log_type(const T&) {
std::clog << demangle(typeid(T).name()) << '\n';
}
int main() {
// error: incomplete type ‘DebugType<int>’ used in nested name specifier
// debug_type<int>();
log_type<int>();
// // error: invalid use of incomplete type ‘struct DebugType<std::basic_istream<char> >
// debug_type(std::cin);
log_type(std::cin);
return 0;
}