3

从一些元编程代码开始:

template<class... Ts>
class list {}; //a generic container for a list of types

template<class in_list_type>
class front //get the type of the first template parameter
{
    template<template<class...> class in_list_less_template_type, class front_type, class... rest_types>
    static front_type deduce_type(in_list_less_template_type<front_type, rest_types...>*);
public:
    typedef decltype(deduce_type((in_list_type*)nullptr)) type;
};

此代码适用于此:

typedef typename front<list<int, float, char>>::type type; //type is int

但是当第一项是函数类型时编译失败:

// no matching function for call to 'deduce_type'
typedef typename front<list<void (), float, char>>::type type;

我目前只能访问 XCode,无法确认这是否只是一个 XCode 错误。我正在使用 XCode 4.5.1,使用 Apple LLVM 编译器 4.1。

4

1 回答 1

4

当模板参数deduce_type被推导时,front_type作为void()候选。但是,这将deduce_type具有类型void ()()(函数返回一个函数——alias<void()>()如果您假设template<typename T> using alias = T;在范围内)。这是一个错误,类型推导失败。

一个解决方案是deduce_type返回类似的东西identity<front_type>,并type成为typename decltype(deduce_type((in_list_type*)nullptr))::type.

于 2012-10-17T21:32:19.440 回答