首页 > 解决方案 > 具有相同类型值的变量的 std::initializer_list

问题描述

我试图从我的一个个人项目中删除一些冗余代码,并想到动态创建一些属性,所以代码如下

#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::sfor它替换second它实际上编译得很好,而且如果我隐式指定它的类型second也编译得很好,但我不喜欢在任何地方指定类型,所以有什么方法可以修复它如果我删除 的类型,它将无法编译first,所以有什么方法可以删除 first 的类型规范如果有人想要https://godbolt.org/z/GSb8CL
, 这里是 godbolt 链接

标签: c++templatesc++17metaprogramming

解决方案


推荐阅读