Концепция или черта функтора с указанными c аргументами? - PullRequest
3 голосов
/ 01 февраля 2020

Я пытаюсь создать concept, который можно использовать для безопасной проверки того, что у функтора есть определенные критерии. Это мой код прямо сейчас:

template<typename T>
void fetch(T&& f)
{
  fetch_helper(&f, &std::unwrap_ref_decay_t<T>::operator());
}

template<typename T, typename... Args>
void fetch_helper(T* obj, void (T::*f)(Args...) const)
{
  // do stuff
}

Я использую fetch, чтобы взять объект функтора, а затем использую fetch_helper для его работы. Однако я хочу реализовать прив. concept или type trait, который проверял бы, что типы аргументов уникальны (у меня уже есть реализованная концепция для IsUnique<T...>). Чтобы программа не компилировалась, если функтор не соответствует критериям.

// compiles
fetch([](int h){

});

// doesnt compile
fetch([](int h, int j){

});

Как я могу применить свой constrait IsUnique к аргументам объекта функтора в fetch? Я попытался добавить концепцию requires в свою вспомогательную функцию, но это все еще позволяет вызывать fetch с неверными аргументами. Мне как-то приходится применять ограничение аргументов в fetch.

Ответы [ 2 ]

2 голосов
/ 02 февраля 2020

Как это?

template<typename T, typename... Args>
    requires IsUnique<Args...>
void fetch_helper(T* obj, void (T::*f)(Args...) const) 
{
  // do stuff
}

template<typename T>
    requires requires (T&& f) {fetch_helper(&f, &std::unwrap_ref_decay_t<T>::operator());}
void fetch(T&& f)
{
  fetch_helper(&f, &std::unwrap_ref_decay_t<T>::operator());
}
1 голос
/ 01 февраля 2020

Если я вас правильно понял, вы хотите что-то вроде этого:

// TypeTraits if IsUnique is a typical trait inheriting from std::true_type or std::false_type
template<typename T, typename... Args>
std::enable_if_t<IsUnique<Args...>::value> fetch_helper(T* obj, void (T::*f)(Args...) const)
{
  // do stuff
}

// Concept
template<typename T, typename... Args> requires (IsUnique<Args...>)
void fetch_helper(T* obj, void (T::*f)(Args...) const)
{
  // do stuff
}

Если вы хотите проверить уже в fetch, вы можете добавить ограничение, может ли fetch_helper вызываться с соответствующими аргументами ( в основном повторяя код внутри).

...