функтор C++ и шаблоны функций

Если приветствуется сценарий пакетной обработки Python: я использовал BeautifulSoup для простого анализа заголовка из HTML, urllib для загрузки библиотек HTML и unicodecsv в порядке чтобы сохранить все символы из заголовка Youtube.

Единственное, что вам нужно сделать, это поместить csv с URL-адресом одного (именованного) столбца с URL-адресами видео Youtube в той же папке, что и скрипт, и назвать его yt-urls .csv и запустите скрипт. Вы получите файл yt-urls-title.csv , содержащий URL и его заголовки.

#!/usr/bin/python

from bs4 import BeautifulSoup
import urllib
import unicodecsv as csv

with open('yt-urls-titles.csv', 'wb') as f:
    resultcsv = csv.DictWriter(f, delimiter=';', quotechar='"',fieldnames=['url','title'])
    with open('yt-urls.csv', 'rb') as f:
        inputcsv = csv.DictReader(f, delimiter=';', quotechar='"')
        resultcsv.writeheader()
        for row in inputcsv:
            soup = BeautifulSoup(urllib.urlopen(row['url']).read(), "html.parser")
            resultcsv.writerow({'url': row['url'],'title': soup.title.string})
15
задан Evan Teran 2 June 2009 в 22:15
поделиться

5 ответов

Я не знаю другого «прямого» способа, кроме синтаксиса:

 a.operator()<1>();

. Если вы готовы изменить код, можно переместить параметр шаблона в класс или использовать (boost | tr1) :: bind для создания объекта (boost | tr1) :: function.

10
ответ дан 1 December 2019 в 01:05
поделиться

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

a.test <1> (); и a.operator () <1> (); работают, потому что они служат функциями шаблонов.

Используйте boost :: bind (проверьте библиотеки boost), чтобы исправить это.

struct A {
    void operator()(int n) {
        std::cout << n << std::endl;
    }
};

int main(int argc, char* argv[]) {
    A a;
    boost::function<void()> f = boost::bind<void>(a, 1);
    f(); // prints 1

    return 0;
}

И вам даже не нужно возиться с шаблонами!

2
ответ дан 1 December 2019 в 01:05
поделиться

Вы можете вызвать только

a.operator()<1>();

, но без использования функтора. Функторам нужен не шаблонный оператор (), поскольку они должны иметь возможность вызываться как varname () , и это не будет работать с вашим кодом.

Чтобы сделать его настоящим функтором, измените свой код на шаблонный класс (функторы - это классы):

#include <iostream>

template<int N>
struct A {
    void operator()() {
        std::cout << N << std::endl;
    }
};

int main() {
    A<1> a;
    a();
}
26
ответ дан 1 December 2019 в 01:05
поделиться

Вы застряли. Рассматривали ли вы что-то вроде

struct A {
    template<int N>
    struct B
    {
        void operator()()
        { std::cout << N << std::endl; }
    };

    template<int N>
    B<N> functor() {return B<N>();}
};

int main()
{
    A a;
    a.functor<1>()();
}
1
ответ дан 1 December 2019 в 01:05
поделиться

Нет, выхода нет. Как вы сказали, вы должны либо вызвать оператор явно (что противоречит цели), либо аргументы шаблона должны быть выведены компилятором.

0
ответ дан 1 December 2019 в 01:05
поделиться
Другие вопросы по тегам:

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