使用 C++ 模板定义函数,但显式删除它以防止滥用
Use a C++ template to define a function but explicitly delete it to prevent misuse
我有一个带有构造函数的模板类,我想在其中明确禁止使用定义良好的列表之外的任何类型的类型,如下所示:
template<typename Anything>
class MyClass
{
public:
MyClass(int &);
MyClass(float &);
MyClass(Anything &) = delete;
}
但是,由于整数和双精度版本的代码是相同的,并且仅在类型上有所不同,因此我想使用模板化版本来定义它,例如:
template<typename Anything>
MyClass<Anything>::MyClass(Anything &var)
{
/* Code that operates over var */
...
}
而不是实际上必须复制两个有效构造函数的代码。
但是,当我尝试这样做时,我得到:
error: redefinition of 'MyClass<Anything>::MyClass(Anything&)'
它通过删除"= 删除">来工作。
有没有办法使用模板来定义函数,但不明确允许接收比显式描述的类型更多的类型?
我检查了如何防止函数模板中的隐式转换?以及为什么我可以阻止原语而不是用户定义类型的隐式转换?,但它们的问题似乎与当前问题不等同。
多谢。
更新:使用 gcc-4.8.5,它可以工作!!即使包含= delete关键字。
您的定义的问题在于您正在尝试实现您用= delete
标记的确切功能。
您实际上想要另一个同时适用于int
和float
的函数模板。您可以通过首先定义IntOrFloat
谓词来实现这一点:
template <typename T>
using IntOrFloat = std::bool_constant<
std::is_same_v<T, int> || std::is_same_v<T, float>>;
然后,您可以定义两个明确的构造函数,它们使用std::enable_if_t
来检查谓词是否由用户传入的类型满足:
class MyClass
{
public:
template <typename T,
std::enable_if_t<IntOrFloat<T>{}>* = nullptr>
MyClass(T&);
template <typename Anything,
std::enable_if_t<!IntOrFloat<Anything>{}>* = nullptr>
MyClass(Anything&) = delete;
};
使用示例:
int main()
{
int v0 = 0;
float v1 = 0.f;
const char* v2 = "igijsdg";
MyClass x0{v0}; // OK
MyClass x1{v1}; // OK
MyClass x2{v2}; // Error
}
魔杖盒上的现场示例
相关文章:
- 将数组的地址分配给变量并删除
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C/C++编译器通常会删除重复的库吗
- 从链接列表c++中删除一个项目
- C++如何通过用户输入删除列表元素
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 使用函数"remove"删除重复元素
- 如何从多映射中删除特定的重复项
- 运算符C++ "delete []"仅删除 2 个前值
- 删除指向指针的指针是运行时错误吗
- 将指针设置为"nullptr"并不能防止双重删除?
- 为什么示例代码访问IUnknown中已删除的内存
- 如何通过 getter 函数删除矢量的元素?
- 从控制台中删除最后打印的元素
- C++中的线程安全删除
- 如何从存储在std::映射中的std::集中删除元素
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数