std :: initializer_list варианта со значениями того же типа - PullRequest
0 голосов
/ 22 февраля 2020

Я пытался удалить некоторый избыточный код из одного из моих личных проектов, и у меня появилась идея динамически создавать некоторые свойства, поэтому код выглядит следующим образом:

#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

...