在地图中使用std :: type_index作为值

时间:2017-09-13 12:26:25

标签: c++ c++11 constructor rtti typeinfo

我正在尝试创建std::unordered_map,其中std::type_index。以下代码段有效:

std::unordered_map<std::type_index, int> workingMap;
workingMap[typeid(int)] = 1;
workingMap[typeid(char)] = 2;

但是这个没有运行并抛出错误:

std::unordered_map<int, std::type_index> failingMap;
failingMap[1] = typeid(int);
failingMap[2] = typeid(char);
  

CS2512:'std :: type_index :: type_index':没有合适的默认构造函数。

我不完全理解这个错误,这些例子中的构造函数之间有什么区别?是否可以制作typeid(..) 而不是密钥的地图?

2 个答案:

答案 0 :(得分:20)

问题是operator[],而不是地图的实际使用。问题是如果找到键,operator[]将分配默认值并返回对该值的可修改引用,这对于std::type_index是不可能的。您可以使用emplaceinserttry_emplace或任何其他不需要默认构造函数的修饰符。

答案 1 :(得分:1)

我们当然可以为int main() { std::unordered_map<std::type_index, int> workingMap; workingMap[typeid(int)] = 1; workingMap[typeid(char)] = 2; std::unordered_map<int, std::optional<std::type_index>> failingMap; failingMap[1] = typeid(int); failingMap[2] = typeid(char); } 创建一个可以为空的包装器。

import {Observable, ReplaySubject} from 'rxjs/Rx';

public loadProfile(): Observable<any> {
  console.log('loading profile');
  return this.http.get('/profile').map(res => res.json());
}

public isUserLoggedInObs(): Observable<boolean> {
  const userLoggedIn: ReplaySubject<boolean> = new ReplaySubject<boolean>;
  this.loadProfile.first().subscribe(
     user => userLoggedIn.next(user.loggedIn === true)
  )
  return userLoggedIn.asObservable();
}


canActivateChild(childRoute: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | Observable<boolean>  {
   return this.profileService.isUserLoggedInObs()
}

当然,现在我们有std :: optional ...

python3 manage.py makemigrations my_app
python3 manage.py migrate