Я пытался удалить некоторый избыточный код из одного из моих личных проектов, и у меня появилась идея динамически создавать некоторые свойства, поэтому код выглядит следующим образом:
#include <functional>
#include <string>
#include <variant>
struct t {
void i(int) {}
void s(std::string) {}
void b(bool) {}
};
int main() {
using setters = std::variant<std::function<void(t *, int)>,
std::function<void(t *, std::string)>,
std::function<void(t *, bool)>>;
std::initializer_list<std::pair<const char *, setters>> props{
{"first", std::function<void(t*, int)>(&t::i)}, {"second", &t::i}};
int i = 0;
for(auto& p : props) {
if (std::get<std::function<void(t*, int)>>(p.second))
i += 2;
}
return i;
}
, это на самом деле не скомпилируется, но если я замените &t::i
на &t::s
для second
, он на самом деле хорошо компилируется, а также, если я неявно указываю тип second
, он тоже хорошо компилируется, но я не люблю указывать типы везде, поэтому есть ли способ исправить это, а также он не скомпилируется, если я удалю тип first
, так что есть ли способ удалить спецификацию типа для первого
Вот ссылка на Godbolt, если кто-то хочет https://godbolt.org/z/GSb8CL