Как сделать шаблон функции параметром для теста? - PullRequest
0 голосов
/ 10 ноября 2018

Я хочу протестировать эквивалентную шаблонную функцию-член шаблона класса.(В качестве фона я хочу предложить пользователям библиотеки «классическую» нотацию функций с помощью .bar () и молчаливую нотацию с |, & и т. Д. Но я не хочу дублировать полный тестовый код.)

#include <utility>   

template <typename T>
struct foo
{
    template <typename U>
    auto bar(U&& u)&& {
        // whatever happens here. 
        return foo<T>();
    }

    template <typename U>
    auto operator|(U&& u)&& {
        return bar(std::forward<U>(u));
    }

    template <typename U>
    auto bar(U&& u) const& {
        // whatever happens here.
        return foo<T>();
    }

    template <typename U>
    auto operator|(U&& u) const& {
        return bar(std::forward<U>(u));
    }
};

int main() {
    using void_t = void();
    using op_t = foo<void>(foo<void>::*)(void_t)&&;

    op_t ops[] = {static_cast<op_t>(&foo<void>::bar<void_t>),
                  static_cast<op_t>(&foo<void>::operator|<void_t>)};

    for (const auto& op : ops) {
        auto sut = (foo<void>{}.*op)([](){});
        // test the behaviour of sut
    }
}

звонит, например, сообщает мне, что «адрес перегруженной функции 'bar' не может быть static_cast для типа 'op_t'"

Или я на неправильном пути, и это невозможно?(Я пробовал clang 6 и gcc 7)

1 Ответ

0 голосов
/ 10 ноября 2018

Я могу получить код для компиляции, изменив op_t на

using op_t = foo<void>(foo<void>::*)(void_t &&) &&;
//                                          ^^

и sut до

auto sut = (foo<void>{}.*op)(*[](){});
//                           ^

([](){} может быть преобразовано в указатель функции, но *op принимает ссылку на функцию, поэтому мы должны разыменовать указатель).

В качестве альтернативы, вместо изменения sut, вы также можете изменить void_t на

using void_t = void (*)();
//                  ^^^

Теперь void_t уже является указателем на функцию, поэтому вам не нужно разыменовывать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...