仅用于模板化类型的附加构造函数<char>
Additional constructor for templated type for <char> only
我有一个带有一个模板参数'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*
构造函数时,这仍然会给你它,而其他T
s没有const T*
构造函数。但我们仍然有std::is_constructible<Container<int>, const char*>
,这可能会破坏其他逻辑。所以坚持SFINAE。
您也可以使用静态断言
#include <type_traits>
template <typename T>
void Foo(T) {
static_assert(std::is_same<T, const char*>::value, "T must be const char *");
}
int main(int argc, char* argv[])
{
const char* c = "c";
Foo(c); // compile
Foo(1); // don't compile
}
您可以为char:编写构造函数
template <> Container<char>::Container(const char* data) {}
以下是示例:
Videone
这被称为模板专业化:
template<>
class Container<char>
{
public:
Container(const char *);
// ... the rest of the class declaration
};
现在,从所有意图和目的来看,这实际上是创建一个单独的类。除了构造函数之外,您还必须编写和声明它的所有其他方法。这可能需要对主模板类进行大量的代码复制,但通常可以在公共继承和/或基类的帮助下进行一些组织。
所有这些都到位了:
Container<int>
将解析为您的主模板,以及
Container<char>
让你上专业课。专业化本质上是根据模板参数从几个备选模板中选择一个。
相关文章:
- "error: no matching function for call to"构造函数错误
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 选择要调用的构造函数
- 如何委托派生类使用其父构造函数?
- 构造函数正在调用一个使用当前类类型的函数
- 没有用于初始化C++中的变量模板的匹配构造函数
- 初始化具有非默认构造函数的std::数组项的更好方法
- 当从函数参数中的临时值调用复制构造函数时
- 在c++构造函数中使用随机字符串生成器
- 一对向量构造函数:初始值设定项列表与显式构造
- 从构造函数抛出异常时如何克服内存泄漏
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 具有默认模板类型的默认构造函数的类型推导
- 使用dynamic_cast和构造函数时出错
- 在c++中使用向量时,如何调用构造函数和析构函数
- 奇怪的构造函数行为