Объявление функции с той же сигнатурой функции данного параметра шаблона

Я пишу класс-оболочку, который скрывает реализацию. Как я могу получить подпись функции данного параметра шаблона?

template <class T>
struct wrapper
{
  static typename std::result_of<&T::impl>::type
  call(...) { // this function has the same signature of T::impl();
    // here goes the jobs to do, such as logging or something
    return T::impl(...);
  }
};

struct sum : public wrapper<sum>
{
private:
  friend class wrapper<func>
  static int impl(int a, int b, int c) {
    return a + b + c;
  }
};

int main()
{
  bind_to(&sum::call); // set binding
  std::cout << sum::call(1,2,3) << std::endl;
}

person Inbae Jeong    schedule 05.09.2013    source источник
comment
Что означает строка struct sum : wrapper<sum>?   -  person Mikhail    schedule 05.09.2013
comment
@Mikhail: это наследование   -  person David Rodríguez - dribeas    schedule 05.09.2013
comment
Структура наследуется от класса шаблона, специализированного на самой структуре?   -  person Mikhail    schedule 05.09.2013
comment
@Михаил Да. это CRTP   -  person Inbae Jeong    schedule 05.09.2013
comment
@kukyakya Очень круто! Однако не кажется ли вам, что этот продвинутый шаблон отвлекает от реального вопроса, который вы задавали?   -  person Mikhail    schedule 05.09.2013
comment
@BЈовић Не могли бы вы пояснить это? Я думал, что часть друга необходима, так как impl() является частной функцией. @Mikhail Пример слишком упрощен, но в wrapper::call() есть еще несколько заданий. Я создаю привязку к другому языку, поэтому я думаю, что это единственный способ, иначе мне нужно скопировать и вставить задания в wrapper::call().   -  person Inbae Jeong    schedule 05.09.2013
comment
хорошо, вы правы. нужен частный   -  person BЈовић    schedule 06.09.2013


Ответы (1)


Используйте пакет параметров:

template <class T>
struct wrapper
{
    template <typename... Args>
    auto call(Args&&... args) -> decltype(T::impl(std::forward<Args>(args)...))
    {
        return T::impl(std::forward<Args>(args)...);
    }
};
person 0x499602D2    schedule 05.09.2013
comment
Да, я знаю, что пересылка аргументов работает, но мне нужен указатель функции на call(), что невозможно при идеальной пересылке. - person Inbae Jeong; 05.09.2013
comment
это даже не компилируется - person BЈовић; 06.09.2013
comment
Это компилируется для меня. Так у вас включен C++11? - person 0x499602D2; 06.09.2013