テンプレートをC++でテンプレートにしたい14。先験的には、打ち鳴らす++ V3.8でコンパイルしたときは、次のコードは、トリックにしかしテンプレートから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
、次の式を行うようだfalseを返します。
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 ++の場合はfalseです。
私の質問は、std::is_same
のg ++とclang ++の両方の要件を満たすテンプレートマップをテンプレートに実装するにはどうすればいいですか?私は最後の手段としてマクロを使用するつもりです...
非常に興味深い、ありがとう。それはいくつかの仕事が必要ですが、それはそれが価値があるかもしれないと思います。私が理解していない何か:なぜあなたはタイプ「zapply」を導入していますか?例を提示するだけですか? – Kevin
@Kevinさて、あなたは 'apply'自身でメタプログラムできるようにしたいのですが、あなたはテンプレートではなくタイプとしてそれを必要とします。 ;)たとえば、ztemplatesのリストとタイプのリストがあるとします。まず、2つのリストの相互積を生成します(2つの要素のリストのリストを生成します)。次に、クロスプロダクト要素またはそれ以上のものにfmapを適用します。 – Yakk