шаблонный оператор () перегрузка C++

Нажмите на выпадающий треугольник в верхнем правом углу Навигатора и выберите "Filters.. ".

Eclipse по умолчанию только предлагает Вам" .class" и ". ".

, Если Вы выбираете ". *", Вы скроете .svn файлы. Очевидно, все другие .something файлы также будут скрыты.

8
задан Jon Seigel 10 April 2010 в 18:17
поделиться

3 ответа

В таком случае, как ваш, я бы использовал boost :: function как тип функтора. Затем вы можете передавать как функциональные объекты, так и указатели на функции, сохраняя тот же интерфейс.

1
ответ дан 5 December 2019 в 12:10
поделиться
#include <iostream>

template<size_t i, class f_type> void call_with_i(f_type f);

struct A {

    template < size_t i >
    void operator()() const {
        /* no link err in demo */
    }

    template < size_t i >
    void foo() {
        /* no link err in demo */
    }
};

int main(int argc, char * const argv[]) {
    A f;

    enum { Constant = 42 };

    f.operator()<Constant>();
    f.foo<Constant>();

    return 0;
}

Есть ли способ вызвать его таким образом, чтобы тот же синтаксис также вызывал бесплатную шаблонную функцию?

Не могли бы вы пояснить? (псевдокод или что-то в этом роде)

0
ответ дан 5 December 2019 в 12:10
поделиться

Шаблон элемента является зависимым именем, поскольку его семантика зависит от типа f_type . Это означает, что вы должны поставить «шаблон» перед его именем (чтобы устранить неоднозначность использования токена «меньше»), аналогично тому, как вы должны поставить typename перед зависимыми полными именами:

template<size_t i, class f_type>
void call_with_i(f_type f) {
  f.template operator()<i>();
  // f.template foo<i>();
}

В качестве обходного пути , вы можете использовать вспомогательный тип:

template<size_t N> struct size_t_ { }; // or boost::mpl::int_

template<size_t i, class f_type>
void call_with_i(f_type f) {
  f(size_t_<i>());
}

Теперь вы можете определить свой operator () следующим образом:

template<size_t i> void operator()(size_t_<i>) const {
  // i was deduced automatically by the function argument. 
}

Это удобно для шаблонных конструкторов, для которых вы не можете использовать f_type () () или что-то в этом роде. В этом случае они должны будут быть выведенными.

13
ответ дан 5 December 2019 в 12:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: