c++ - 如何构造一个 std::variant 类型对象,其自身模板化和构造函数转发参数
问题描述
我已经定义var_t
为 type std::variant< Fum<Bazz>, Fum<Ack> >
。模板化类Fum<>
应该将其构造函数参数转发给 Bazz 和 Ack,以便它可以创建它们。但是,我收到以下错误:
[g++ default #1] error: no matching conversion for functional-style cast
Bazz 和 Ack 定义:
#include <iostream>
#include <variant>
#include <string>
// Bazz
// C'tor takes in float
struct Bazz {
float f;
Bazz(float)
{
std::cout << "Bazz Main" << std::endl;
}
};
// Ack
// C'tor takes in std::string
struct Ack {
std::string str;
Ack(std::string strParam)
:str(strParam)
{
std::cout << "Ack Main" << std::endl;
}
};
定义:
// Fum<>
// Variadic C'Tor should forward args to value of type T
template<typename T>
class Fum {
public:
T value;
template<typename ... Params>
Fum<T>(Params&& ... argsForT)
:value(std::forward<Params>(argsForT)...)
{std::cout << "FUM C'TOR" << std::endl;}
};
var_t 定义:
typedef std::variant< Fum<Bazz>, Fum<Ack> > var_t;
以下代码有效:
// Fum forwards string to Ack as expected and creates Ack emplace.
int main() {
Fum<Ack>(std::string("Hello, World!"));
}
// >>>> Ack Main C'Tor
// >>>> Fum C'Tor
以下不起作用:
int main() {
var_t((std::string("Hello, World!")));
}
// [g++ default #1] error: no matching conversion for functional-
// style cast
我相信Fum
模板化的 C'Tor 会引起歧义。因此, var_t 不知道它是否应该构造Fum<Ack>
or Fum<Bazz>
。但我不确定。那么我该如何解决这个问题呢?
解决方案
std::variant
对emplace 建设有适当的超载。
尤其是:
template< class T, class... Args >
constexpr explicit variant(std::in_place_type_t<T>, Args&&... args);
因此,您的代码可以通过以下方式修复:
var_t(std::in_place_type<Fum<Ack>>, std::string("Hello, World!"));
推荐阅读
- git - GIT - 从提交的分支中保存分支和主文件,其中与主文件不同
- javascript - 环境变量:使用custom-enviroment-variables.json,定义应用程序机密的正确方法是什么
- php - Symfony 5通过ajax返回表单错误
- asp.net-core - 强制 ASP .NET Core 2.1 使用 HTTPS 并返回 400 错误
- php - 如何从另一个 PHP 文件中的类调用函数以进行路由?
- angular - 在 Angular 中检测对象值的变化
- java - 将 json 列表解析为 Java 对象列表
- mysql - 仅当先前的数据库不存在时才创建 mysql 数据库并导入外部数据库
- python - python openstack SDK通过进度条显示文件上传
- javascript - 使用外部搜索 Vuetify 数据表?