Я хочу сделать шаблон шаблона в C++ 14. Априори, кажется, что следующий код делает трюкШаблон для шаблона в C++ 14
template<class T>
struct KeyType {};
template<class T>
struct ValueType {
T x;
};
template<template<class> class K>
struct Map;
template<>
struct Map<KeyType> {
template<class T>
using type = ValueType<T>;
};
ValueType<int> test{42};
Map<KeyType>::type<int> testM{42}; // Same as above
Однако следующее выражение, при компиляции с лязгом ++ v3.8, возвращает ложь.
template<template<class> class TemplateType>
struct NeedsTemplate;
std::is_same<
NeedsTemplate<ValueType>,
NeedsTemplate<Map<KeyType>::type>
>::value; // False
Я понимаю, почему это неверно: it has already been answered here. В принципе, стандарт гарантирует, что шаблонные экземпляры псевдонимов должны распознаваться как одно и то же, но ничего не говорит о шаблонах. Следовательно, с g ++, std::is_same
истинно, и с clang ++, это неверно.
Мой вопрос: как я могу реализовать шаблон для шаблона, который удовлетворяет требованиям std::is_same
как с g ++, так и с clang ++? Я готов использовать макрос как последнее средство ...
Очень интересно, спасибо. Это требует некоторой работы, но я думаю, что это может стоить того. Что-то я не понимаю: почему вы вводите тип 'zapply'? Это только пример? – Kevin
@Kevin Ну, вы хотите, чтобы метапрограмма с помощью 'apply' сама, вам нужно это как тип, а не как шаблон. ;) Например, предположим, что у вас есть список ztemplates и отдельный список типов. Сначала вы создаете кросс-произведение двух списков (создавая список списков из 2-х элементов). Затем вы накладываете fmap на элементы перекрестного продукта или что-то подобное. – Yakk