c++ - 如何在编译时检查类型

标签 c++ visual-c++ c-preprocessor

我提供了使用 float 或 double 类型编译程序的选项,但是有一个问题:我需要手动设置 GL_FLOAT 或 GL_DOUBLE,因为我不知道如何执行以下操作:

typedef float MYTYPE;

#if MYTYPE == float
    #define GL_MYTYPE GL_FLOAT // used for vertex array parameters.
#else
    #define GL_MYTYPE GL_DOUBLE
#endif

注意:我没有 C++11 或其他任何东西,只有很好的旧 C++。

最佳答案

在 C++11 中,您可以使用 std::conditionalstd::is_same作为:

#define GL_MYTYPE  std::conditional                       \
                   <  std::is_same<MYTYPE,float>::value,  \
                      GL_FLOAT,                           \
                      GL_DOUBLE                           \
                   >::type                            

在 C++03 中,您可以自己实现这些功能:

template<bool B, class T, class F>
struct conditional { typedef T type; };

template<class T, class F>
struct conditional<false, T, F> { typedef F type; };

template<class T, class U>
struct is_same { static const bool value = false; };

template<class T>
struct is_same<T, T> { static const bool value = true; };

请注意,conditional 的实现取自 site本身。

关于c++ - 如何在编译时检查类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10913728/

相关文章:

java - 具有结构 JNA 数组的结构

visual-c++ - Visual C++不会同时显示两个重新定义错误

c++ - 一个类作为另一个类的友元的成员函数

从宏调用中调用宏

C 预处理器魔法

c++ - 设计容器的技巧

c++ - 为什么我不能像这样在 QMap 上调用插入?

c++ - boost log 打印源代码文件名和行号

c++ - 如何从 dll 正确返回 std::list

C: const 还是 define?有什么区别,为什么第二个报告错误?