c++语法问题-传递构造函数和圆括号中的参数到另一个函数?



我希望这不是一个太愚蠢的问题,但是我碰巧发现了一些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是无符号整型。

我的问题:

  1. 为什么mt19937的类模板类型没有定义?
  2. 为什么我们调用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的地方。

相关内容

  • 没有找到相关文章

最新更新