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
任何提示?
謝謝,工作!然而;這個語法對我來說很新。你能給我一些關於它的用法的信息嗎? – kyku
@kyku - 編譯器必須知道它是一個模板,否則它會將其解析爲'f1.target'是要成爲模板的一部分,而不是比較的一部分。 –
@kyku:有關更多信息,請參閱此FAQ:[什麼是 - >模板,.template和::模板語法?](http://www.comeaucomputing.com/techtalk/templates/#templateprefix) – ildjarn