c++ - 如何构造一个 std::variant 类型对象,其自身模板化和构造函数转发参数

标签 c++

我已经定义了var_t类型为 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 定义:

// 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>。或 Fum<Bazz> .但我不确定。那么我该如何解决这个问题呢?

最佳答案

std::variant放置构造有适当的重载。

特别是:

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!"));

关于c++ - 如何构造一个 std::variant 类型对象,其自身模板化和构造函数转发参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57394129/

相关文章:

c++ - SVM 训练数据误差

c++ - 使用可变参数模板解包参数列表时获取参数索引

c++ - #ifdef _DEBUG vs 2008 中的 Release模式

c++ - 如何在 Qt 中对字符串进行转义?

c++ - 阴影参数

c++ - 启动具有特定变量值的派生类

c++ - catch block 中的函数抛出异常

c++ - glGetAttribLocation() 返回 -1 但变量是统一的,如何解决?

c++ - Web 开发人员对为 Android 开发感到好奇

c++ - 多态性 : "A pointer to a bound function may only be used to call the function"