我希望这不是一个太愚蠢的问题,但是我碰巧发现了一些c++语法,我想和你们所有的专家确认一下。
下面是有问题的代码:https://github.com/PacktPublishing/Mastering-CPP-Multithreading/blob/master/Chapter01/ch01_mt_example.cpp
特别是这个调用:
static thread_local mt19937 generator(hash<thread::id>()(this_thread::get_id()));
我得到了代码的要点;查找不同的类引用很容易,或者只是运行代码,但我想理解那里的语法。
查看c++参考:
mt19937
的构造函数接受一个result_type
,定义为第一个类模板参数的别名。- 我理解
hash<thread::id>
将给我们thread::id
类型的默认哈希函数,然后我们将this_thread::get_id()
传递给它。c++参考说hash::operator()
返回参数的哈希值,size_t
类型的值,其中size_t
是无符号整型。
我的问题:
- 为什么
mt19937
的类模板类型没有定义? - 为什么我们调用
hash<thread::id>()
没有参数,但把(this_thread::get_id())
放在它旁边?
我想我很困惑,因为我希望这行读作:
static thread_local mt19937<size_t> generator(hash<thread::id>(this_thread::get_id()));
有人能解释一下为什么不是吗?
谢谢!
我试图理解上面的代码;我看了c++的参考资料,但是有一些语法元素我不懂,很难从参考资料中学习。
为什么没有定义
mt19937
的类模板类型?
std::mt19937
不是一个类模板。它是一个类型定义:
std::mersenne_twister_engine<std::uint_fast32_t, 32, 624, 397, 31, 0x9908b0df, 11,
0xffffffff, 7, 0x9d2c5680, 15, 0xefc60000, 18,
1812433253>
所以,不需要提供模板参数
为什么我们调用
hash<thread::id>()
没有参数,但然后把(this_thread::get_id())
放在它旁边?
std::hash<thread::id>
是一个类,而不是一个函数。
第一组圆括号包含std::hash<thread::id>
构造函数的参数。不带参数,默认构造
第二组括号是对std::hash<thread::id>
实例上的operator()
的调用——这就是提供线程id的地方。