Частичная специализация содержимого кортежа с помощью вариативных аргументов

В настоящее время я пытаюсь заставить код по-разному реагировать на разные типы. Это не точный код, но он передает сообщение.

template<class A, class B>
struct alpha {
  enum { value = 0 };
};

template<class T, class... Args>
struct alpha<std::tuple<Args...>, T> {
  enum { value = 1 };
};

// This gets ignored
template<class T, class... Args>
struct alpha<std::tuple<Args..., std::vector<T> >, T> {
  enum { value = 2 };
};

// This gets ignored
template<class T, class... Args>
struct alpha<std::tuple<Args..., T>, T> {
  enum { value = 3 };
};

template<class T, class... Args>
struct alpha<T, std::tuple<Args...> > {
  enum { value = 4 };
};

template<class... LArgs, class... RArgs>
struct alpha<std::tuple<LArgs...>, std::tuple<RArgs...> > {
  enum { value = 5 };
};

int main(int argc, char* argv[]) {
  std::cout << alpha<std::tuple<int, double>, double>::value << std::endl; // prints 1
  return 0;
}

Я пробовал больше, чем показывает этот код, но пока ничего не работает, и я столкнулся с проблемой явной специализации в области, не связанной с пространством имен. Для справки, я работаю над gcc 4.6 (тот, который поставляется с сервером oneiric), который, как мне кажется, имеет полную поддержку вариативных шаблонов. Меня не волнует, насколько уродливо это становится, если реализация работает для обнаружения последнего аргумента пакета параметров, а также других типов. Есть предложения?

РЕДАКТИРОВАТЬ: Я хотел поделиться решением, которое я использовал на основе ответов (это пример).

template<typename T> struct tuple_last;

template<typename T, typename U, typename... Args>
struct tuple_last<std::tuple<T,U,Args...>> {
  typedef typename tuple_last<std::tuple<U,Args...>>::type type;
};

template<typename T>
struct tuple_last<std::tuple<T>> {
  typedef T type;
};

namespace details {
// default case:
template<class T, class U>
struct alpha_impl {
enum { value = 1 };
};

template<class T>
struct alpha_impl<T, T> {
enum { value = 101 };
};

template<class T>
struct alpha_impl<T, std::vector<T>> {
enum { value = 102 };
};

// and so on.
}

template<class T, class... Args>
struct alpha<std::tuple<Args...>, T>
  : details::alpha_impl<T, tuple_last<std::tuple<Args...>>;
5
задан James McNellis 29 September 2012 в 03:15
поделиться