在专门化一个类模板时,我希望有一个专门化目标成熟的类(完整的构造函数,析构函数等)和一个专业化目标基元(int
,float
等)。我见过的唯一部分专精是针对指针类型(通过T*
)。有没有办法做到这一点?有没有办法专门化一个模板来定位基元?
3
A
回答
7
您可以使用C++ 11 type_traits。这里有一些让你开始的东西,你可以根据需要更多的专注:
#include <type_traits>
#include <iostream>
template<typename T, typename E = void>
struct A; // undefined
template<typename T>
struct A<T, typename std::enable_if<std::is_class<T>::value && !std::is_pod<T>::value>::type> {
A() { std::cout << "I'm a class, but I'm not a pod type" << std::endl; }
};
template<typename T>
struct A<T, typename std::enable_if<std::is_class<T>::value && std::is_pod<T>::value>::type> {
A() { std::cout << "I'm a class and a pod type" << std::endl; }
};
template<typename T>
struct A<T, typename std::enable_if<!std::is_class<T>::value>::type> {
A() { std::cout << "I'm not a class" << std::endl; }
};
class X {};
class Y { ~Y(){} };
int main()
{
A<X> a1;
A<Y> a2;
A<int> a3;
}
0
boost::has_trivial_assign
应该给你这个信息。
template <class T>
struct has_trivial_assign : public true_type-or-false_type {};
+0
类可以有微不足道的赋值操作符,所以这会给OP带来误报。 –
相关问题
- 1. 有没有办法基于C++中的参数成员来专门化模板?
- 2. 有没有办法专门
- 3. 有没有办法使用模板专门化从新[]分离新?
- 4. 你能模板专门化一个没有模板化的子类吗?
- 5. 只有一个索引的C++方法模板专门化
- 6. 有没有一种方法来专门为Android指定CSS
- 7. 模式可以基于继承来专门化模板吗?
- 8. 使用枚举来专门化模板
- 9. 有没有什么办法使这个模板专业化链接?
- 10. C++模板专门化
- 11. float的模板专门化
- 12. 模板值专门化
- 13. 是否可以使用没有参数的模板专门化?
- 14. 模板专门化并没有做我需要的东西
- 15. 模板函数没有对象参数专门化
- 16. C++模板专门化方法问题
- 17. C++模板类的模板专门化
- 18. 是否有可能为模板类型专门化模板?
- 19. 具有模板参数的模板函数专门化
- 20. 是否有可能基于模板类型参数的嵌套typedef的存在来专门化模板定义?
- 21. 一组类型的模板专门化
- 22. 没有专门定时它
- 23. 模板专门
- 24. 有没有办法来覆盖编译器::模板中定义()
- 25. 有没有一种方法来定位前一个元素?
- 26. 如何专门为一个模板给定的模板
- 27. 部分专门化具有不同模板参数的模板的模板类
- 28. 有没有办法用一行来初始化一个容器?
- 29. 专门设计一个模板类?
- 30. 有没有办法做模板声明
什么是特别的关于你想专业化不同的成熟班?他们有一些你需要的特殊成员吗? –
那么,对于原语,我可以为某些操作做一个“memcpy”,而对于类,我需要分别调用每个复制操作。 – TheBuzzSaw
@TheBuzzSaw:那么你不想专注于原始类/类,而是专注于基元/类,而是在POD与非POD类型上 –