Нажмите на выпадающий треугольник в верхнем правом углу Навигатора и выберите "Filters.. ".
Eclipse по умолчанию только предлагает Вам" .class" и ". ".
, Если Вы выбираете ". *", Вы скроете .svn файлы. Очевидно, все другие .something файлы также будут скрыты.
В таком случае, как ваш, я бы использовал boost :: function как тип функтора. Затем вы можете передавать как функциональные объекты, так и указатели на функции, сохраняя тот же интерфейс.
#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;
}
Есть ли способ вызвать его таким образом, чтобы тот же синтаксис также вызывал бесплатную шаблонную функцию?
Не могли бы вы пояснить? (псевдокод или что-то в этом роде)
Шаблон элемента является зависимым именем, поскольку его семантика зависит от типа 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 () ()
или что-то в этом роде. В этом случае они должны будут быть выведенными.