2011-07-04 17 views
4

私はtarget()テンプレートメソッドを使ってstd :: functionsを比較するための汎用コードを書こうとしています。ここに私の非ジェネリックサンプルコードがあります:Variadicテンプレートの質問

#include <cstdio> 
#include <functional> 

static void bar() {} 
static void baz() {} 

bool cmp(std::function<void()> f1, std::function<void()> f2) 
{ 
    void (**t1)() = f1.target<void(*)()>(); 
    void (**t2)() = f2.target<void(*)()>(); 
    return (!t1 && !t2) || (t1 && t2 && *t1 == *t2); 
} 

int main(int argc, char *argv[]) 
{ 
    std::function<void()> f1(bar), f2(baz), f3(bar); 
    printf("equal:  %d\n", cmp(f1, f3)); 
    printf("non-equal: %d\n", cmp(f1, f2)); 
    return 0; 
} 

これはgcc 4.6.1 -std = C++ - xでコンパイルして正常に動作します。しかし、私は、次の一般的なCMPをコンパイルしようとしている場合、コンパイラは、解析のエラーコードで失敗した機能:

#include <cstdio> 
#include <functional> 

static void bar() {} 
static void baz() {} 


template<typename Result, typename ... Args> 
bool cmp(std::function<Result(Args...)> f1, std::function<Result(Args...)> f2) 
{ 
    Result (**t1)(Args...) = f1.target<Result(*)(Args...)>(); 
    Result (**t2)(Args...) = f2.target<Result(*)(Args...)>(); 
    return (!t1 && !t2) || (t1 && t2 && *t1 == *t2); 
} 

int main(int argc, char *argv[]) 
{ 
    std::function<void()> f1(bar), f2(baz), f3(bar); 
    printf("equal:  %d\n", cmp(f1, f3)); 
    printf("non-equal: %d\n", cmp(f1, f2)); 
    return 0; 
} 

エラーコードは次のとおりです。

functional.cpp: In function ‘bool cmp(std::function<_Res(_ArgTypes ...)>, std::function<_Res(_ArgTypes ...)>)’: 
functional.cpp:11:44: error: expected primary-expression before ‘(’ token 
functional.cpp:11:46: error: expected primary-expression before ‘)’ token 
functional.cpp:11:52: error: expected primary-expression before ‘...’ token 
functional.cpp:11:58: error: expected primary-expression before ‘)’ token 
functional.cpp:12:44: error: expected primary-expression before ‘(’ token 
functional.cpp:12:46: error: expected primary-expression before ‘)’ token 
functional.cpp:12:52: error: expected primary-expression before ‘...’ token 
functional.cpp:12:58: error: expected primary-expression before ‘)’ token 

任意のヒント?

答えて

5

これはおそらく

f1.template target<Result(*)(Args...)>() 
    ^^^^^^^^ 

と次のラインのために類似していなければなりません。

+0

ありがとうございました!しかしながら;この構文は私にとってはかなり新しいものです。あなたは私にそれについてのいくつかの情報を教えてもらえますか? – kyku

+3

@kyku - コンパイラはそれがテンプレートであることを知っていなければなりません。そうでなければ、 'f1.target 'はテンプレートの一部であり、比較の一部ではないことを知る必要があります。 –

+1

@kyku:詳細については、次のFAQを参照してください。[[テンプレート]、[テンプレートとテンプレートの構文について] [http://www.comeaucomputing.com/techtalk/templates/#templateprefix] – ildjarn

関連する問題