【发布时间】:2015-10-26 07:13:07
【问题描述】:
我有一门课
template <unsigned N>
class TEST {
public:
template <unsigned P, unsigned I> struct test { static __forceinline void Run() { std::cout << 0 << std::endl; } };
template <unsigned I> struct test <N, I> { static __forceinline void Run() { std::cout << 1 << std::endl; } };
};
我想实现的是cout“1”当P==N,但是我在运行时发现
TEST<0>::test<0, 10>::Run();
它仍然给出0。
后来我发现当模板列表中只有一个参数时它起作用了:
template <unsigned N>
class TEST {
public:
template <unsigned P> struct test { static __forceinline void Run() { std::cout << 0 << std::endl; } };
template <> struct test <N> { static __forceinline void Run() { std::cout << 1 << std::endl; } };
};
虽然看起来很简单,但其中的机制是什么,当有两个参数时我应该如何使其工作?
编辑
作为 m.s.已经指出,这段代码可以在Wandbox 上的 gcc 编译器上完成它的工作,但它在我的 vs2013 上失败了。有人知道为什么吗?
正如 Petr 所指出的,有趣的是在 MSVS 上,当
P==I结果为“1”时。-
当我将代码更改为:
template <typename N> class TEST { public: template <typename P, unsigned I> struct test { static __forceinline void Run() { std::cout << 0 << std::endl; } }; template <unsigned I> struct test <N, I> { static __forceinline void Run() { std::cout << 1 << std::endl; } }; };
TEST<int>::test<int, 10>::Run(); 给出“1”。
【问题讨论】:
-
原始代码的输出为“1”:melpon.org/wandbox/permlink/CyW5VmcwsFteOys0
-
@m.s.我测试过,很神奇。我的 vs2013 编译得到了不同的结果。
-
@m.s,在 VS2013 上也为我输出 0,在 gcc 4.8.2 上为我输出 1。
-
最搞笑的是
TEST<2>::test<10, 10>::Run();在MSVS2013上为我打印1! -
@Petr 是的,这和我一样。当“P==I”为“1”时。
标签: c++ visual-studio templates partial-specialization