【发布时间】:2014-01-26 22:05:19
【问题描述】:
我正在使用 C++11 不错的新生成器和分布生成随机值。在一个函数中,它就像一个魅力,看起来像这样:
void foo() {
mt19937 generator;
uniform_int_distribution<unsigned> distribution;
auto dice = bind(distribution, generator);
// dice() will now give a random unsigned value
}
但是我怎样才能将所有三个对象都放在一个类中作为数据成员呢?我可以简单地将generator 和distribution 写为数据成员,但是如何在不知道(或想知道)其确切类型的情况下使dice 成为数据成员?没想到这个
class X {
mt19937 generator;
uniform_int_distribution<unsigned> distribution;
decltype(bind(distribution, generator)) dice;
};
在 Visual Studio 2013 中产生错误 error C2660: 'bind' : function does not take 2 arguments。
【问题讨论】:
-
@juanchopanza ...这是以一些开销为代价的。
-
看起来像一个 MSVC 错误。
-
仅供参考,
bind将创建其参数的副本,因此如果您要创建dice2,它将使用与dice不同的分布和 RNG。为避免这种情况,您需要将参数包装在reference_wrapper -
标准对从
std::bind返回的类型的默认和/或复制构造有何看法?编辑:20.8.9.1.2/5“备注:返回类型应满足MoveConstructible的要求。” -
@chris 好的,找到了。它在 C++11 中是合法的。非静态数据成员可能出现在未计算的操作数中。