QuickCheck-подобный шаблон функции сравнительного анализа в C ++

Вдохновленный элегантным способом автоматического создания (случайных) экземпляров заданного типа на Haskell, например, в QuickCheck, я пытаюсь выяснить, как написать как простой в использовании как ... Возможный каркас бенчмаркинга в C ++. Я полагаю, что буду использовать шаблоны функций, возможно, с помощью новых функций в C ++ 11, таких как шаблоны с переменными параметрами. Я надеюсь, что мне нужно только указать функцию или, что еще лучше, шаблон функции и тип контейнера шаблона STL (а это в свою очередь value_type ) совместим с аргументом (ами) функции.

Я понял, что сравнение функций с набором входов различного размера несколько похоже на то, как потоки настраиваются и порождаются в C ++ 11. Моей первой попыткой было бы скопировать конструктор класса thread и превратить его в benchmark работает как

template< class Function, class ...Args >
inline
void benchmark( Function&& f, Args&&... args );

Я не уверен, должны ли мы использовать ссылки с r-значением здесь или нет. Однако f и args должны быть явно созданы до вызова benchmark, что привело к громоздкому нефункциональному использованию.

Это привело меня к попытке пропустить аргументы вызова и использовать вместо них только аргументы шаблона:

namespace pnw
{
    template <template <typename> class Function, typename Container>
    inline
    void benchmark_container()
    {
        Function<typename Container::iterator> f;
        Container c(10);
        f(c.begin(), c.end());
    }
}

называется как

typedef int T;
typedef std::vector<T> C;
pnw::benchmark_container<std::sort, C>();

Однако теперь компиляция выдается как

tests/t_histogram.cpp: In function ‘void test_benchmark()’:
tests/t_histogram.cpp:56:44: error: no matching function for call to ‘benchmark_container()’
tests/t_histogram.cpp:56:44: note: candidate is:
tests/../benchmark.hpp:32:6: note: template<template<class> class Function, class Container> void pnw::benchmark_container()

Я не уверен, что C ++ может обрабатывать передачу шаблона функции исключительно через аргументы шаблона другой вызывающей функции.

Это правильный способ сделать это или это невозможно в C ++ 11? Я использую GCC-4.6.

4 голоса | спросил Nordlöw 17 Jpm1000000pmTue, 17 Jan 2012 17:23:35 +040012 2012, 17:23:35

1 ответ


0

Если вам нужно поддерживать параметры с «более высоким родом», вы должны использовать параметры шаблона-шаблона . Кроме того, внутри шаблона f::g будет считаться значением, если не определено typename. Поэтому вы должны написать:

template <template <typename> class Function, typename Container>  // <--
inline void benchmark_container()
{
    Function<typename Container::iterator> f;   // <--
    ...

(Все они доступны до C ++ 11.)


Изменить. Но звонок

benchmark_container<std::sort, C>();

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

Если вы хотите работать только с такими функциями, как std::sort, которые не имеют связанных контекстов, вы можете передать указатель на функцию, чтобы устранить неоднозначность с перегрузкой использовать:

template <typename Container,
          void (*func)(typename Container::iterator, typename Container::iterator)>
inline void benchmark_container()
{
    Container c (10);
    func(c.begin(), c.end());
}

benchmark_container<std::vector<int>, std::sort>();

или

template <typename Container>
inline void benchmark_container(void (*func)(typename Container::iterator, typename Container::iterator))
{
    Container c (10);
    func(c.begin(), c.end());
}

benchmark_container<std::vector<int>>(std::sort);

или просто вручную выберите, какую перегрузку вы хотите использовать, что позволяет передавать объекты общих функций:

template <typename Container, typename F>
inline void benchmark_container(const F& function)
{
    Container c (10);
    function(c.begin(), c.end());
}

benchmark_container<std::vector<int>>(std::sort<std::vector<int>::iterator>);
ответил kennytm 17 Jpm1000000pmTue, 17 Jan 2012 19:57:00 +040012 2012, 19:57:00

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132