具有特定参数的函子的概念或特征?

Concept or trait for functor with specific arguments?

我正在尝试创建一个 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对其进行操作。但是我想实现pref。 concepttype trait 将检查参数类型是否唯一(我已经为 IsUnique<T...> 实现了概念)。这样如果仿函数不符合标准,程序就不会编译。

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

});

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

});

如何将约束 IsUnique 应用到 f​​etch 中仿函数对象的参数?我尝试将 requires 概念添加到我的辅助函数中,但这仍然允许使用错误的参数调用 fetch。我以某种方式必须在获取中应用参数的约束。

如果我没理解错的话,你想要这样的东西:

// 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 是否可以使用适当的参数调用(基本上重复里面的代码)。

像这样?

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());
}