2011-03-08 12 views
0
template<class T> 
struct TypeX; 

template<> 
struct TypeX<int(...)>//HERE IF WITHOUT ELLIPSIS IT WILL COMPILE 
{ 
    static std::string get_type() 
    { 
     return "int()"; 
    } 
}; 

template<> 
struct TypeX<int> 
{ 
    static std::string get_type() 
    { 
     return "int"; 
    } 
}; 

template<class T> 
struct type_descriptor 
{ 
    typedef T type; 
    typedef typename std::remove_reference<T>::type no_ref_type; 
    typedef typename std::remove_pointer<no_ref_type>::type no_ref_no_pointer_type; 
    typedef typename std::remove_cv<no_ref_no_pointer_type>::type no_ref_no_pointer_no_cv_type; 
    typedef typename std::remove_all_extents<no_ref_no_pointer_no_cv_type>::type no_ref_no_pointer_no_cv_no_ext_type; 
    typedef no_ref_no_pointer_no_cv_no_ext_type bare_type; 

    enum {isArray = std::is_array<T>::value, isPointer = std::is_pointer<T>::value, isRef = std::is_reference<T>::value}; 

    static std::string get_type() 
    { 
     return pointer_<isPointer>() + array_<std::is_array<no_ref_no_pointer_type>::value>() + TypeX<bare_type>::get_type(); 

    } 
}; 
template<bool C> 
std::string array_() 
{return "";} 

template<> 
std::string array_<true>() 
{return "array of";} 

template<bool C> 
std::string pointer_() 
{return "";} 

template<> 
std::string pointer_<true>() 
{return "pointer to";} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    cout << type_descriptor<int(*)()>::get_type(); 

    return 0; 
} 

コード内のコメントを参照してください。問題は、私がエラーを起こしている任意の数を意味すると思われる省略記号に特化すれば、なぜ私はそれがコンパイルする引数を特化していないのでしょうか?テンプレート部分的特殊化

答えて

1

私はそれ コンパイル引数なしのために特化したときに、私はエラーを取得、しかし よ 任意の数を意味すると仮定省略記号について を、専門あれば質問は、なぜでしょうか?

(あなたがmainでそれを使用しようとしているとして)省略記号は括弧の任意の数を意味するものではありませんので。 省略記号は、関数(C++ 03)で可変数の引数を暗示するために使用されます。


EDIT:たぶん次の例では、あなたが欲しいものを実装するのに十分なヒントを与えた:

template<class T> 
struct TypeX 
{ 
     TypeX() { cout << "TypeX" << endl; } 
}; 

template<typename T> 
struct TypeX<T(*)()> //will match with : int (*)(), char (*)(), etc! 
{ 
     TypeX() { cout << "TypeX<T(*)()>" << endl; } 
}; 

template<typename T, typename S> 
struct TypeX<T(*)(S)> //will match with : int (*)(int), char (*)(int), etc! 
{ 
     TypeX() { cout << "TypeX<T(*)(S)>" << endl; } 
}; 

template<typename T, typename S, typename U> 
struct TypeX<T(*)(S, U)> //will match with : int (*)(int, char), char (*)(int, int), etc! 
{ 
     TypeX() { cout << "TypeX<T(*)(S, U)>" << endl; } 
}; 
int main() { 
     TypeX<int*>(); 
     TypeX<int(*)()>(); 
     TypeX<int(*)(int)>(); 
     TypeX<int(*)(char)>(); 
     TypeX<int(*)(char, int)>(); 
     TypeX<int(*)(short, char)>(); 
     return 0; 
} 

出力:http://www.ideone.com/fKxKK

+0

私は理解できません、あなたは説明できますか? mainで私は特殊化を使用しようとしています:fncへのポインタはゼロの引数を取ってintを返します。 –

+0

@私たちは何もできません:実際には、文法「」は特殊化には使用できません。あなたはこれをやろうとしています:http://www.ideone.com/ah1iH ........私はあなたにさらなる質問があれば教えてください! – Nawaz

+0

@私たちは何もできません。答えを編集しました。これらの例をあげれば、どれくらいの利点があるのか​​教えてください。http://www.ideone.com/fKxKK – Nawaz

0

アン:ideoneで

TypeX 
TypeX<T(*)()> 
TypeX<T(*)(S)> 
TypeX<T(*)(S)> 
TypeX<T(*)(S, U)> 
TypeX<T(*)(S, U)> 

デモelipsisは、関数が呼び出しの各場所で任意の数の引数を受け入れることができることを意味します。

int f(...); // signature 

int x = f(); // invocations 
int y = f(my_int, my_double); 

関数シグネチャ自体は単純に各呼び出し(すなわちint f()int f(int, double))によって暗示より具体的な署名から異なるあります。

int (*)(...)の場合に特化していますが、実際に最初のelipsisを指定する関数タイプのみが一致します。 int (*)(int)のような他の機能は一致しません。

関連する問題