首页 > 试题广场 >

下面有关c++ traits,说法正确的有?

[不定项选择题]
下面有关c++ traits,说法正确的有?
  • 一个traits包括了enum、typedef、模板偏特化(template partial specialization)
  • typedef定义了各个类的各自不同的类型定义
  • 模板偏特化用于实现各个类的不同功能
  • 当函数,类或者一些封装的通用算法中的某些部分会因为数据类型不同而导致处理或逻辑不同,traits会是一种很好的解决方案
traits 第一次听说。 
发表于 2015-01-09 17:51:25 回复(5)
记住
发表于 2016-10-05 14:59:46 回复(0)
traits是C++的自动类型判断。
出发点:因为C++没有反射的机制。所以利用traits来完成。
大量使用场景:STL(STL中大量使用traits来区分类别。注释POD标量类型和类类型的构造函数等)
机制:
template <typename T> 
//泛化
struct is_void
{ static const bool value = false; };
template <> 
//特化
struct is_void<void>
{ static const bool value = true; };

int main(){
    std::cout<<is_void<int>::value;
    std::cout<<is_void<void>::value;
}
根据模板的自动类型推导。在调用void的时候会使用特化版本。而其他类型呢?对,使用泛化版本。
这样就巧妙的区分了不同的类型。这就是traits的基本原理。

C++11中提供了大量的traits,可参考http://www.cplusplus.com/reference/type_traits/
发表于 2015-06-27 20:49:38 回复(0)
不知道的就全选,还对了
发表于 2019-01-03 15:33:31 回复(0)
类型萃取机制 type traits,详细解释请看侯捷《STL源码剖析》第三章
发表于 2017-08-15 15:07:08 回复(0)
《STL源码剖析》,traits编程技法,,没见过用enum啊
发表于 2017-07-15 15:56:12 回复(1)
不知道traits是什么... 
发表于 2017-02-20 18:02:53 回复(0)
traits技术:即类型萃取技术,用一句话总结就是根据模板参数的类型获得该类型必要的信息,然后根据这些信息做出合适的条件判断。如果不怎么接触C++的模板编程,基本很少认识这个东西。

应用情景:现在有一个函数,传入一个迭代器iter和一个整形n,函数需要将这个迭代器后移动到第n个数据,然后问题在于当这个迭代器来自vector时,它是支持随机存取的,可以直接通过iter+n的方式得到结果,但当这个迭代器来自list时,它并不支持随机存取,需要循环遍历一遍,才能得到结果。

使用思路:构建一个名为traits的类模板,然后进行偏特化,在偏特化的模板中保存两种迭代器的类型信息,在定义刚才函数的模板,这样在方法中直接通过traits<T>::type来判断类型信息,同理也可以在traits类里定义静态方法,通过traits<T>::方法名来返回一些必要的信息。

代码例子:
#include <iostream>
#include <vector>
#include <list>
#include <iterator>

using namespace std;

template<typename Iter>
struct traits {
	using iter_type = typename iterator_traits<Iter>::iterator_category;
};

template<typename Iter>
struct traits<Iter*> {
	using iter_type = random_access_iterator_tag;
};

template <typename Iter>
void after_n(Iter& it, int n) {
	if constexpr (is_same_v<typename traits<Iter>::iter_type, random_access_iterator_tag>) {
		it = it + n;
		cout << "触发了随机访问迭代器" << endl;
	}
	else {
		while (n--) ++it;
		cout << "触发了前后迭代器" << endl;
	}
}


int main() {

	// 案例1:list迭代器(双向迭代器,触发逐个移动)
	std::list<int> lst{ 1,2,3,4,5 };
	auto lstIt = lst.begin();
	after_n(lstIt, 3);  // 跳转到4,O(n)时间
	cout << "此时list的迭代器指向的值为: " << *lstIt << endl;

	// 案例2:vector迭代器(随机访问,直接跳转)
	std::vector<int> vec{ 1,2,3,4,5 };
	auto vecIt = vec.begin();
	after_n(vecIt, 3);  // O(1)时间
	cout << "此时vector的迭代器指向的值为: " << *vecIt << endl;

	// 案例3:原生指针(特化后的随机访问)
	int arr[5]{ 1,2,3,4,5 };
	int* p = arr;
	after_n(p, 3);       // O(1)时间
	cout << "此时arr的迭代器指向的值为: " << *p << endl;

	return 0;
}

发表于 2025-04-22 15:19:26 回复(0)
第一次听triis
发表于 2023-11-15 02:41:28 回复(0)
感觉题目不是很严谨啊……
不一定非要有 enum 和 typedef 啊,又不是都是 iterator traits 的那种……
#include <iostream>

// 没用上 enum 和 typedef 的 trait
// 编译期判断类型是否一致

template <typename T, typename V>
struct same_type {
  static const bool value = false;
};

template <typename T>
struct same_type<T, T> {
  static const bool value = true;
};

// C++14
template <typename T, typename R>
constexpr bool same_type_v = same_type<T, R>::value;

int main() {
    std::cout << (same_type_v<int, int> ? "Is same type" :"Not the same");
    std::cout << (same_type_v<int, short> ? "Is same type" :"Not the same");
}


发表于 2020-07-08 00:56:44 回复(0)
不知道的地方
发表于 2019-08-03 21:46:38 回复(0)
traits n. 特性,特质,性格(trait的复数)
应该是c++的新特性吧。
发表于 2018-05-17 00:12:48 回复(0)
traits第一次听说。
发表于 2018-04-07 13:09:15 回复(0)