我想在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編譯,返回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
爲真,並且鐺++,這是錯誤的。
我的問題是:我怎樣才能實現一個模板到模板地圖,將滿足std::is_same
要求與g ++和clang ++?我願意使用宏作爲最後的手段...
非常有趣,謝謝。它需要一些工作,但我認爲這可能是值得的。我不明白的是:爲什麼要引入'zapply'類型?只是提供一個例子嗎? – Kevin
@Kevin嗯,你想用'apply'本身進行元編程,你需要它作爲一個類型而不是模板。 ;)例如,假設您有一個ztemplates列表和一個單獨的類型列表。首先,您生成兩個列表的交叉產品(生成2個元素的列表的列表)。然後你fmap適用於跨產品元素或其他。 – Yakk