Вопрос о вариативных шаблонах

Я пытаюсь написать общий код для сравнения std :: functions с использованием его метода шаблона target (). Вот мой неуниверсальный пример кода:

#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
задан Johannes Schaub - litb 4 July 2011 в 15:44
поделиться