具有 enable_if 和 is_constructible 的可变参数构造函数

问题描述 投票:0回答:0

我有一门课叫

NameAndTag
。它有构造函数:

    NameAndTag();
    NameAndTag(std::string name_or_tag);
    NameAndTag(boost::uuids::uuid tag) : Tag(tag) {}

现在,我想定义另一个类,其(模板)构造函数采用可变数量的“事物”,这些事物可以传递给

NameAndTag::NameAndTag
。另外,我希望模板类型是隐式的。

我尝试过不同的方法。我想工作的是这个:

    template<typename... NameOrTag>
    PathToObject(std::enable_if_t<
        std::is_constructible_v<NameAndTag, NameOrTag>
    , NameOrTag&&>... obj_path);

但是,我认为编译器无法确定

NameOrTag
的类型。当模板不接受任何参数时,编译器说我传递了太多参数。

为了让

NameOrTag
的类型更容易理解,我试过:

    template<typename... NameOrTag>
    PathToObject(NameOrTag&&... obj_path,
        std::enable_if_t<
            std::conjunction_v
            <
                std::is_constructible_v<NameAndTag, NameOrTag>...
            >
            , bool> dummy = true);

但我想混合包模板和可选参数是行不通的。编译器说没有

PathToObject("name", uuid)
的匹配项。

我想做的事情有意义吗? 我怎样才能做到这一点?我必须使用 C++17...


编辑:我必须使用 C++17。

c++ constructor c++17 variadic-templates typetraits
© www.soinside.com 2019 - 2024. All rights reserved.