【发布时间】:2011-06-18 08:38:14
【问题描述】:
我一直在努力使用不是 C++0x 代码,而是常规 C++。不要问我为什么必须使用常规的 C++,这只是一种愚蠢的要求。
所以事情是这样的:我需要在枚举中获取一个值为 1 或 0 的值,这与某个语句是真还是假有关。 所以当然,我在枚举中模板化了一个包含 0 的结构,并使用第二条语句对其进行了专门化,其中枚举包含 1 而不是 0。
对我来说似乎很合法,但是,它告诉我应该使用专业化的参数。这有点奇怪,因为我尝试以所有可能的方式使用它,但它只是不断弹出这个错误。
代码如下:
template<typename T>
struct CanPrint
{
template<size_t>
struct Value { enum { val = 0 }; };
template<size_t>
struct Value<sizeof(True)> { enum { val = 1 }; };
enum
{ value = Value<sizeof(IsTrue<T>(0))>::val };
};
我敢打赌,如果它不是部分特化,那么它会起作用,但显式的不能在命名空间范围内。而且我显然不能在模板中专门化模板而不专门化它们。我可以吗?
【问题讨论】:
-
答案解释了如何使事情变得 wokr,但从名称来看,您只需要一种类型,根据您定义的专业化说明某些内容可打印或不可打印,在这种情况下您只需要 @ 987654322@作为主模板,然后对于每个可打印类型,定义
template <> struct CanPrint<MyType> { enum { value = 1 }; };我想不出没有C++11自动检测operator<<的方法。
标签: c++ templates metaprogramming template-meta-programming