为什么内部没有简化模板表达式?

时间:2016-05-30 23:40:05

标签: c++ templates c++11

以下示例不起作用:

#include <iostream>

template <int index, template <typename> class Head,
        template <typename> class... Tail>
struct TemplateTupleElement {
    template <typename T>
    using Type =
            typename TemplateTupleElement<index - 1, Tail...>::template Type<T>;
};

template <template <typename> class Head, template <typename> class... Tail>
struct TemplateTupleElement<0, Head, Tail...> {
    template <typename T>
    using Type = Head<T>;
};

template <typename T>
class Dummy {
};

template <template <typename> class T>
class TemplateDummy {
public:
    static void print() {
        std::cout << "Template" << std::endl;
    }
};

template <>
class TemplateDummy<Dummy> {
public:
    static void print() {
        std::cout << "Specialization" << std::endl;
    }
};

int main(int argc, char* argv[]) {
    TemplateDummy<TemplateTupleElement<0, Dummy, Dummy>::Type>::print();
    TemplateDummy<TemplateTupleElement<1, Dummy, Dummy>::Type>::print();

    return 0;
}

我希望输出为:

Specialization
Specialization

然而,用g ++编译的程序的输出((Ubuntu 5.3.0-3ubuntu1~14.04)5.3.0 20151204):

Specialization
Template

Clang(版本3.4-1ubuntu3)的输出是:

Template
Template

我可以理解,编译器在内部以不同的方式表示两个模板表达式:

  1. Dummy
  2. TemplateTupleElement<1, Dummy, Dummy>::Type
  3. 为什么第二个表达式不是“简化”到g ++的第一个表达式中,为什么Clang没有用元组索引正确映射表达式?

0 个答案:

没有答案