将类型特征从实现中定义
Decoupling type traits definition from implementation
让我们考虑以下类,该类检查提供的类型是字符串,并使用类型特征根据结果调用不同的函数。原始源具有对OBJ的类型依赖性,这是一个简化的示例:
template <typename Obj>
class example {
public:
template <bool IdIsString = std::is_same<std::string, Obj>::value>
typename std::enable_if<IdIsString, void>::type
doStuff() {
this->object->doSomething();
}
template <bool IdIsString = std::is_same<std::string, Obj>::value>
typename std::enable_if<!IdIsString, void>::type
doStuff() {
this->object->doSomethingElse();
}
private:
AnyObject object;
};
我将如何从类中解除定义(例如将其存储在example_inline.hpp中),而无需在定义中提供每个类型的特征情况?
理想的解决方案看起来像这样:
// header.hpp
template <typename Obj>
class example {
public:
void doStuff();
}
// header_inline.hpp
template <typename Obj>
template <bool IdIsString = std::is_same<std::string, Obj>::value>
typename std::enable_if<IdIsString, void>::type
example::doStuff() {
// ...
}
// ...
以上显然是不可能的。一种解决方案是将类type_trait函数从类中解除并将其放入一个详细的名称空间中不是很优雅。
有一个很好的解决方案解决这个问题吗?我真的很想让所讨论的标题很容易读取,而不会用tons tons enable_if的杂物。
感谢您对此事的任何输入。
您可以根据std::is_same
的返回值超载:
template<typename T>
class example
{
private:
void doStuff(std::true_type)
{
obj->doSomething();
}
void doStuff(std::false_type)
{
obj->doSomethingElse();
}
public:
void doStuff()
{
doStuff(std::is_same<T, std::string>{});
}
};
在这种简单的情况下,您也可以在类模板的模板参数上专门使用doStuff
:
#include <iostream>
#include <string>
template<class T>
struct example
{ void doStuff(); };
template<class T>
void example<T>::doStuff()
{ std::cout<<"defaultn"; }
template<>
void example<std::string>::doStuff()
{ std::cout<<"stringn"; }
int main()
{
example<int>{}.doStuff();
example<std::string>{}.doStuff();
}
实时示例
相关文章:
- 如何正确实现和访问运算符的各种自定义枚举器
- 根据C++标准的定义实现"is_similar"类型特征
- 如何实现自定义匹配器以检查 Catch2 中的对象相等性
- 它是否定义了哪些算法可以接受可变 lambda 的实现?
- 双链表的自定义实现不起作用(教育)
- 比较迭代器会使程序崩溃,而不会在自定义气泡排序实现中出现错误
- 为自定义打印调试实现传递任何类型的变量
- 基于自定义void_t实现的成员检测
- c++ 中的自定义分配器,用于不调用secure_string实现
- C# HashSet VS C++ std::unordered_set 使用自定义类键。C++慢...不可能。如何实现 C# 的速度?
- 私有在函数定义/实现的返回值范围内是什么意思 (c++)?
- 如何测试AVL树的自定义实现
- DirectX 12自定义实现与DirectX 11相同
- 可以将STD :: StreamBuf的自定义实现中的异常交付给流用户
- 从链表访问对象(自定义实现)
- C++中 malloc 的自定义实现
- 隐藏类型定义实现
- 自定义实现具有位表示的bool向量-如何实现运算符[]
- 在OpenCV中自定义实现
- c_str() 自定义实现/在每个字符串末尾"="