从一些元编程代码开始:
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。
答案 0 :(得分: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
的别名。