ここでの目標は、パラメーター パックをテンプレートのインスタンスから別のテンプレートにコピーできるようにすることです。に制限しませんでしtuple
た。なぜに制限するのtuple
ですか?
template<template<typename...>class Target, typename Src>
struct copy_pack_types;
template<template<typename...>class Target, template<typename...>class Src, typename... Ts>
struct copy_pack_types< Target, Src<Ts...> > {
typedef Target<Ts...> type;
};
template<template<typename... Ts>class Target, typename Src>
using CopyPackTypes = typename copy_pack_types<Target, Src>::type;
#include <string>
#include <tuple>
template<typename... Ts> struct vct;
template<typename... Ts> struct vct2;
using U = std::tuple<int,char,std::string>;
using X = vct<int,char,std::string>;
using Y = CopyPackTypes< vct, U >; // should be same as X
using Z = CopyPackTypes< vct2, U >; // should be different from X
#include <iostream>
#include <type_traits>
int main() {
std::cout << std::is_same< X, Y >::value << "\n";
std::cout << std::is_same< Z, Y >::value << "\n";
std::cout << std::is_same< Z, vct2<int,char,std::string> >::value << "\n";
}
出力は期待どおり「1 0 1」です。
はCopyPackTypes
、ターゲット テンプレートと、パラメータ パックから構築されたソース タイプを唯一の引数として取ります。次に、パラメーター パックをターゲット テンプレートにコピーします。
パラメーター パックを持ち運ぶ標準的な手法の 1 つは、次のような使用しない型を作成することです。
template<typename...>
struct types {};
タイプのリストのプレースホルダーとしてのみ存在します。次に、これらのいくつかを別のテンプレートに渡すことができます。各パックは互いに「踏む」ことはありません。対象のテンプレートに適用する必要がある場合は、上記の「CopyPackTypes
」のようなものを使用して適用します。
インデックスのパックにも同様の手法が使用されます。
template<size_t...>
struct seq {};
それ以外の場合は、パラメーターの塊を持ち運ぶための「黒いスレート」である役に立たない型です。