У меня есть такой код:
template<auto Function>
struct Bind
{
template<typename... Args>
static auto func(Args&&... args)
{
return std::invoke(Function, args...);
}
};
struct F
{
int i;
auto foo(int ii){ i = ii; }
};
int main()
{
F f{};
Bind<&F::foo>::func(f, 5); //set `i` to 5
return Bind<&F::i>::func(f); //return 5
}
Но теперь мне нужно добавить новую функцию int F::foo();
, и мне все еще нужно иметь возможность вызывать обе функции с func
, например:
template<typename TBind>
auto bar(F f)
{
TBind::func(f, 5); // calls `void F::foo(int)`
return TBind::func(f); // calls `int F::foo()`
}
Возможно сделать это в C ++ 17 и по-прежнему использовать auto Function
?
(C ++ 20 может иметь пользовательские типы в качестве аргумента шаблона значения, которые решают эту проблему)