Специализировать шаблон на основе вложенных внутренних аргументов - PullRequest
1 голос
/ 26 января 2012

Я хочу специализировать шаблоны на основе их внутренних аргументов. Я использую строгую оценку, которая усложняет ситуацию.

Специализации должны основываться на наименьшем совпадении с образцом. Например:

template<typename T>
struct data1;

template<typename T>
struct fun1 {
  using type = data1<T>;
};

template<typename T>
struct fun2;
template<typename T>
struct fun2<data1<T>> {
  using type = data1<T>;
};

fun2<data1<int>> x1;             // this works as expected, T=int
fun2<data1<fun1<int>>>::type x2; // this works as expected, T=fun1<int>
fun2<fun1<int>>::type x3;        // this should be specialized as fun2<data1<int>>, T=int
fun2<fun2<fun1<int>>>::type x4;  // this should be specialized as fun2<data1<int>>, T=int

Как я могу это сделать?

1 Ответ

1 голос
/ 26 января 2012

Вы можете просто использовать параметр шаблона шаблона:

template<typename T>
struct data1;

template<typename T>
struct fun1 {
  using type = data1<T>;
};

template<typename T>
struct fun2;

template<class T>
struct fun2<data1<T>>{
  using type = data1<T>;
};

template<template<class> class X, class T>
struct fun2<X<T>>
  : fun2<typename X<T>::type>{};

Тесты:

#include <type_traits>

static_assert(std::is_same<fun2<data1<int>>::type, data1<int>>::value, "fun2<data1<int>>");
static_assert(std::is_same<fun2<data1<fun1<int>>>::type, data1<fun1<int>>>::value, "fun2<data1<fun1<int>>>");
static_assert(std::is_same<fun2<fun1<int>>::type, data1<int>>::value, "fun2<fun1<int>>");
static_assert(std::is_same<fun2<fun2<fun1<int>>>::type, data1<int>>::value, "fun2<fun2<fun1<int>>>");

int main(){
}

Живой пример на Ideone (с использованием псевдонимов, измененных на typedefs) .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...