gpt4 book ai didi

c++ - 使用 braced-init-list 或传统的 ctor 语法实例化类型

转载 作者:行者123 更新时间:2023-11-30 02:51:48 26 4
gpt4 key购买 nike

我想编写一个 make_unique 版本,如果编译通过,它将使用 { ... } 构造类型,否则 (... )

我有一个尝试

template<typename T, typename... Args>
auto make_unique(Args&&... args) -> decltype(new T {std::forward<Args>(args)...}, std::unique_ptr<T>{}) {
return std::unique_ptr<T>(new T { std::forward<Args>(args)... });
}

这是为 SFINAE 准备的,因为如果 new T { ... } 语法不起作用,它会出现替换失败,但我不知道如何让它替换失败如果 new T(...) 语法有效,而且我也不知道如何制作另一个,以便在 new T { ... } 时无法替代 语法可以工作,如果不能则编译成功,因此它可以使用new T(...) 语法。

最佳答案

您可以使用调度技术通过转换排名来选择过载:

#include <memory>
#include <iostream>

template<typename T, typename... Args>
auto make_unique_impl(int, Args&&... args)
-> decltype(new T {std::forward<Args>(args)...}, std::unique_ptr<T>{}) {
std::cout << "{..} variant" << std::endl;
return std::unique_ptr<T>(new T { std::forward<Args>(args)... });
}

template<typename T, typename... Args>
auto make_unique_impl(short, Args&&... args)
-> decltype(new T (std::forward<Args>(args)...), std::unique_ptr<T>{}) {
std::cout << "(..) variant" << std::endl;
return std::unique_ptr<T>(new T ( std::forward<Args>(args)... ));
}

// dispatcher
template<typename T, typename... Args>
std::unique_ptr<T> make_unique(Args&&... args)
{
return make_unique_impl<T>(0, std::forward<Args>(args)...);
}

调度程序中的调用将首选 int 重载,因为 0int 类型。但如果替换失败,另一个重载也是可行的(通过整数转换)。

使用示例:

struct my_type
{
my_type(int, int) {}
my_type(std::initializer_list<int>) = delete;
};

struct my_other_type
{
my_other_type(int, int) {}
};

int main()
{
make_unique<my_type>(1, 2);
make_unique<my_other_type>(1, 2);
}

关于c++ - 使用 braced-init-list 或传统的 ctor 语法实例化类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19473359/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com