我需要一个可以这样调用的模板:
int x = type_exists< std::vector<int> >::value;
如果在源代码中较早出现#include <vector>
(显式或传递),则应将x设置为1,否则应将x设置为0。
是否可以在C ++中完成?我使用GCC,所以GCC扩展也没问题。
也可以稍微更改一下调用语法。
运行C ++编译器两次都不行:首先只是弄清楚我们是否收到编译错误。
答案 0 :(得分:5)
这不是你想要的,但它与你可以达到的type_exists
特质一样接近:
template<class T> struct Void { typedef void type; };
template<class T, class U = void>
struct type_exists { enum { value = 0 }; };
template<class T>
struct type_exists<T, typename Void<T>::type> { enum { value = 1 }; };
显然,它有效:
static_assert(type_exists<int>::value, "int is not defined");
static_assert(type_exists<SomeNonexistingType>::value, "expected compile-time error");
这完全符合预期。使用GCC 5.4.0进行测试。
答案 1 :(得分:3)
这是不可能的,我害怕。如果我们使用未定义的标识符,我们会得到编译错误,导致此代码:
int x = type_exists< std::vector<int> >::value;
甚至不编译。
此外,标准没有指定要在标准库的头文件(也就是实现定义)中声明的任何预处理器指令,因此即使使用预处理器宏也无法检测到它。