Существуют ли какие-либо средства, позволяющие сделать более сложный вывод типов в шаблонах C ++? - PullRequest
0 голосов
/ 24 марта 2020

Предположим, у меня есть функция шаблона:

template<class T>
void whenMatchesType(std::function<void(T*)> action) { ... }

Я мог бы вызвать это так:

anObject.whenMatchesType<SomeType>([=](SomeType *value) {
    // ...
});

Хотя C ++ способен выводить параметры шаблона из аргументов простых, не Типы шаблонов, я не вижу возможности явно указать тип (как <SomeType>) в этом случае - даже если он предоставляется в качестве параметра типа для первого аргумента.

Есть ли некоторые изменить мой код - или мою компиляцию - с помощью которого я мог бы избежать этой избыточности?

1 Ответ

2 голосов
/ 24 марта 2020

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

Вот простой пример.

#include <iostream>
#include <functional>

template <typename T>
struct parameter_type;

template <typename ReturnType, typename ParameterType>
struct parameter_type<std::function<ReturnType(ParameterType)>> {
    using ParameterT = ParameterType;
};

template <typename T>
using param_t = typename parameter_type<decltype(std::function{std::declval<T>()})>::ParameterT;

template<class T>
void whenMatchesType(T) {
    using Parameter = param_t<T>;
    static_assert(std::is_same_v<Parameter, int>, "Only callables that take int as parameter is allowed");
}

int main() {
    whenMatchesType([](int){});
    //whenMatchesType([](double){});
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...