2011-01-17 11 views
1

私は、特定の引数を持つ関数が存在するかどうかをチェックする方法を探していました。与えられたシグネチャを持つ関数がC++に存在するかどうかの確認

template <class Moo> 
    void exportDataTo(Moo& ret){ 
    extended_solid_loader(ret, *this); 
    } 

複数のポイントで、私はさまざまな種類のextended_solid_loaderを定義するマクロを持っていますが、今、私がしたいプロジェクトに:私は仕事をする(クラスから外部)外部関数に依存しているテンプレートメソッドを持っていますその特定のクラスタイプに対してextended_solid_loaderが定義されていない場合は、デフォルトの関数を使用することができます。 Is it possible to write a template to check for a function's existence? をそれはそれで、私は方法をチェックしていないよ、ちょっと違うようだが、むしろ特定の引数の型を持つ関数の定義:

私はこれに出くわしました。

これは現在可能ですか?

+0

ない重複:http://stackoverflow.com/questions/257288/is-it-possible-to-write-ac-template-to-機能の有無を確認するために – krlmlr

答えて

5

デフォルト実装を提供するextended_solid_loader用の関数テンプレートを提供するだけで、デフォルト実装以外のものを使用したいユーザーはそれを専門にすることができます。

template<class T> 
void extended_solid_loader(T & ret, SomeClass & obj) { 
    // default implementation here 
} 

template<> 
void extended_solid_loader<MooClass>(MooClass & ret, SomeClass & obj) { 
    // special implementation for MooClass here 
} 
+0

それは醜い方法です。テンプレート関数の特殊化の問題があり、テンプレートの名前空間内で特殊化する必要があります。不必要な依存関係など... ADLにそれをさせてください。 –

2

特に特別なことは特にありません。テンプレートに利用可能な関数のバージョンがあることを確認し、ADLに汚い作業をさせてください。この例を確認してください:

#include <iostream> 

namespace bob { 

    struct X {}; 

    void f(X const&) { std::cout << "bob::f\n"; } 
} 

namespace ed { 

    template < typename T > 
    void f(T const&) { std::cout << "ed::f\n"; } 

    template < typename T > 
    struct test 
    { 
    void doit() // not called f and no other member so named. 
    { f(T()); } 
    }; 

} 

int main() 
{ 
    ed::test<int> test1; 
    ed::test<bob::X> test2; 

    test1.doit(); 
    test2.doit(); 

    std::cin.get(); 
} 

あまりにも(非テンプレートが優先されます)名前空間のものなしで動作します。私はちょうどあなたがそうしたときにADLがそれを取り上げることを示すためにそれを使用しました。


元の質問は面白かったです。 C++ 0xの中でそれを行う方法を発見:

template < typename T > 
struct fun_exists 
{ 
    typedef char (&yes) [1]; 
    typedef char (&no) [2]; 

    template < typename U > 
    static yes check(decltype(f(U()))*); 

    template < typename U > 
    static no check(...); 

    enum { value = sizeof(check<T>(0)) == sizeof(yes) }; 
}; 

void f(double const&) {} 

struct test {}; 

#include <iostream> 
int main() 
{ 
    std::cout << fun_exists<double>::value << std::endl; 
    std::cout << fun_exists<test>::value << std::endl; 

    std::cin.get(); 
} 
+0

このコード 2番目のコードサンプルは、fがテンプレート定義のスコープ内にないため、 'double'に対して正しい値を報告しません。 –

関連する問題