C++ 在知道变量类型之前使用自动定义的变量
C++ Using an auto-defined variable before knowing its type
我目前正在尝试在知道其类型之前使用自动定义的变量。为什么?因为类型取决于程序输入。如果用户选择某个分布,程序将根据该分布输出值。代码如下:
std::default_random_engine random_engine;
auto random;
if(from_dist)
{
char* dist_name = strtok(distribution_name, "()");
char* parameters = strtok(nullptr, "()");
if(strcmp(dist_name, "gaussian") == 0)
{
double mean = atof(strtok(parameters, ","));
double stddev = atof(strtok(nullptr, ","));
std::normal_distribution<double> normal_distribution(mean, stddev);
random = std::bind(normal_distribution, random_engine);
}
//TODO: Add more...
else
{
std::cerr << "Invalid distribution. Known distributions:" << std::endl;
std::cerr << "tgaussian(mean,stddev) - gaussian (aka normal) distributions" << std::endl;
exit(EXIT_FAILURE);
}
}
但是,C++不允许我以这种方式使用自动变量。是否有任何替代方案允许我使用以下代码片段(稍后执行(,而不必为每个可能的发行版重复它?
while(true) {
std::string message(OBSERVATION);
for (int i = 0; i < FEATURE_COUNT; i++)
message += " " + ((int) random());
send(sock, message.c_str(), strlen(message.c_str()), 0);
if (wait_time_ms)
sleep(wait_time_ms);
}
random
的目的(如果我正确阅读了您的代码(是成为一个可调用的对象。
您可以通过使random
成为具有正确签名的std::function
对象来解决问题:
std::function<double()> random;
在编译时必须知道用 auto
声明的变量的类型。如果您真的希望能够使用单个变量名称存储不同类型的值,请查看 std::variant。但是,看起来您甚至不需要使用多种类型。如果我正确理解您的代码,则应将random
声明为具有正确签名的std::function
对象。
为了使用auto
必须初始化变量,以便编译器可以推断出类型。 由于您不确定将拥有哪种类型,因此无法使用它。 不过,由于所有随机生成器都具有double()
的形式,因此您可以做的是使用std::function<double()>
。 这将允许您在所需的范围内声明random
,但允许您为其分配所需的生成器。 那看起来像
std::default_random_engine random_engine;
std::function<double()> random;
if(from_dist)
{
char* dist_name = strtok(distribution_name, "()");
char* parameters = strtok(nullptr, "()");
if(strcmp(dist_name, "gaussian") == 0)
{
double mean = atof(strtok(parameters, ","));
double stddev = atof(strtok(nullptr, ","));
random = [=]()
{
static std::normal_distribution<double> normal_distribution(mean, stddev);
return normal_distribution(random_engine);
};
}
//...
}
相关文章:
- 用C++中的一个变量定义一个常量
- 变量定义到C++布尔值转换
- 未声明的标识符错误,但变量定义正确 (?)
- C++多线程程序:变量定义为类成员的隔离错误
- 将变量定义为静态时,为什么可以多次定义它
- 初始值设定项列表与构造函数赋值与变量定义
- 如何根据传递给函数的变量定义特征矩阵大小
- C++ 描述如何使用来简化变量定义
- 如何转发声明依赖于变量定义的类,而变体定义又依赖于模板化类?
- 是否修改其声明语句中的变量定义良好
- 使用类的其他成员变量定义类的成员变量数组
- 是否可以通过全局变量定义具有可变参数数的函数中的参数数量
- 元组 std::get() 不适用于变量定义的常量
- 全局使用变量定义和C 声明
- C++变量定义中的易失性类型量词位置
- 将变量定义为数组和正确的语法
- 多个,包括具有变量定义的头文件
- 调用构造函数,并将成员作为参数解析为变量定义
- 逗号分隔变量定义中关系前的序列
- 如何使用命名变量定义常量右值引用参数的默认值