gpt4 book ai didi

c++ - 仅用于 的模板化类型的附加构造函数

转载 作者:太空狗 更新时间:2023-10-29 23:35:39 24 4
gpt4 key购买 nike

我有一个带有一个模板参数“T”的模板类。我希望这个类有一个构造函数,但是如果 T 是 char 只有一个额外的构造函数“const char*”作为参数。

template <typename T>
class Container
{
public:
// Construct a container from an array of T's
Container(const T* data, int count);

// For char only construct a container from a nul terminated string
// I *only* want this constructor to be valid when T is char
Container(const T* data);
};

有什么办法可以做到这一点,这样我就可以做到:-

const char* init = "Hello";
Container<char> data = init;

会编译但是

const int init[] = {1, 3, 4};
Container<int> data = init;

不会编译。

最佳答案

您可以将其包装在构造函数模板中并使用 SFINAE:

template <typename U=T,
typename = std::enable_if_t<std::is_same<U, char>::value>>
Container(const U* )
{
...
}

这样,Container<char> , 这个构造函数是可行的,但是对于 Container<int>它将是错误的并从重载集中删除。

一个较小的替代方案就是:

Container(const char* ) {
static_assert(std::is_same<T, char>::value, "!");
}

这仍然会给你 const char*需要时构造函数,没有 const T*其他构造函数 T秒。但是那样我们仍然会有 std::is_constructible<Container<int>, const char*> - 这可能会破坏其他逻辑。所以坚持使用 SFINAE。

关于c++ - 仅用于 <char> 的模板化类型的附加构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32455897/

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