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のバグであるかどうかを確認できません。私はXCode4.5.1を使用しており、AppleLLVMコンパイラ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>typetypename decltype(deduce_type((in_list_type*)nullptr))::type

于 2012-10-17T21:32:19.440 に答える