L'obiettivo qui è di essere in grado di copiare un pacchetto di parametri da un'istanza di un modello, in un altro modello. Non l'ho limitato a tuple
, perché ... perché limitarlo a 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";
}
l'uscita è "1 0 1" come previsto.
Lo CopyPackTypes
utilizza un modello di destinazione e un tipo di origine creato da un pacchetto di parametri come unico argomento. Quindi copia il pacchetto di parametri nel modello di destinazione.
Una tecnica standard è da trasportare pacchi parametri intorno è di creare un altrimenti no tipo utilizzare come:
template<typename...>
struct types {};
che esiste solo come segnaposto per un elenco dei tipi. È quindi possibile passare alcuni di questi a un altro modello, e ogni pacchetto non "si calpestano" a vicenda. Quando è necessario applicarlo a un modello di destinazione, si utilizza qualcosa come sopra "CopyPackTypes
" per applicarlo.
Tecniche simili sono utilizzati per pacchi di indici:
template<size_t...>
struct seq {};
tipi altrimenti inutili che sono "liste nere" per trasportare ciuffi di parametri intorno.
+1 Bel tocco con il parametro template template. –