`
tcspecial
  • 浏览: 911446 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

c++11 decay/decltype/declval

阅读更多

 

1. decay

std::decay对类型进行退化处理。

a. T为数组U或数组U引用,则type为U*.

b. T为函数时,则type为std::add_pointer<F>::type.

c. 其它类型则移除cv限定符(const和volatile),则type为std::remove_cv<std::remove_reference<T>::type>::type.

decay_equiv<const int&, int>::value // true
decay_equiv<int[2], int*>::value	// true
decay_equiv<int(int), int(*)(int)>::value // true

 

 

2. decltype

delctype 可以在编译期内推导表达式所得值的类型。

 

template<typename T1, typename T2>  
void sum(T1 &t1, T2 &t2, decltype(t1 + t2) &s)
{  
	s = t1 + t2;  
}

template<typename T1, typename T2>  
auto sum(T1 &t1, T2 &t2) ->decltype(t1 + t2))
{  
	return t1 + t2;  
} 

int hash(char*);
map<string, decltype(hash(nullptr))> mm;	// 动态指定hash()返回类型,方便后续维护

 

 

3. declval

std::declval 返回对象的右值引用,不管对象是否有构造函数,一般配合decltype使用。

 

struct MyOb
{
	MyObj1(){ cout << "Constuctor" << endl; }
	int foo() const { return 1; }
};

struct MyObj
{
	MyObj(const MyObj&){}
	int foo() const { return 1; }
};

void test()
{
	decltype(MyOb().foo()) n0 = 1;					// ok, 构造函数不会调用
	decltype(MyObj().foo()) n1 = 1;					// 编译错误,MyObj没有默认构造函数
	decltype(std::declval<MyObj>().foo()) n2 = 2;	// ok, int
	cout << typeid(n2).name() << endl;				// i
}

 

 

3. 元素分组实例

定义Person结构,如按照人物姓名,年龄,城市各个不同的维度进行分组,可很快写出以下版本:

 

struct Person  
{  
	string name;  
	int age;  
	string city;  
};

template<typename T, typename Fn>  
multimap<T, Person> GroupBy(const vector<Person>& vt, const Fn& keyfn)  
{  
	multimap<T, Person> map;  
	std::for_each(vt.begin(), vt.end(), [&map, $keyfn](const Person& person)  
	{  
		map.insert({keyfn(person), person}); // keyfn返回值为key
	});  

	return map;  
}

 

 

传统方式通过显式指定key类型,可通过c++11语法推导key类型:

方式一:declval

 

multimap<decltype(declval<Fn>()(declval<Person>())), Person> mp;

 

方式二. result_of 

 

multimap<typename std::result_of<Fn(Person)>::type, Person> mp;

 

 

方式二使用更加简洁,用result_of改写上述版本:

typedef typename vector<Person>::value_type value_type; 

template<typename Fn>  
multimap<typename result_of<Fn(value_type)>::type, value_type> GroupBy(const vector<Person>& vt, const Fn& keyfn)  
{  
	typedef typename result_of<Fn(value_type)>::type keytype;   
  	multimap<keytype, value_type> map;

	std::for_each(vt.begin(), vt.end(), [&map, &keyfn](const Person& person)  
	{  
		map.insert({keyfn(person), person});
	});  

	return map;  
}


// 调用
multimap<int, Person> mp = GroupBy(v, [](const Person &p)
{ 
	return p.age; 
});

 

cppreference可能实现:

// Minimal C++11 implementation:
template <class> struct result_of;
template <class F, class... ArgTypes>
struct result_of<F(ArgTypes...)> {
    using type = decltype(detail::INVOKE(std::declval<F>(), std::declval<ArgTypes>()...));
};

 

 

参考链接:

https://en.cppreference.com/w/cpp/types/result_of

https://www.cnblogs.com/anzhsoft/p/3602984.html

 

 

 

 

分享到:
评论

相关推荐

    深入理解C++11:C++11新特性解析与应用(62M高清扫描版)

    《深入理解C++11:C++11新特性解析与应用》这本书是C++编程领域的一本经典著作,旨在帮助读者全面掌握C++11标准带来的诸多新特性和改进。C++11是C++语言的一个重大更新,引入了许多现代化的编程特性,提升了代码的...

    c++11封装thread库的方法示例

    C++11 封装 Thread 库的方法示例 在 C++11 中,std::thread 提供了对多线程的支持,然而不同的平台提供了不同线程 API,这使得代码移植变得困难。为了解决这个问题,C++11 提供了对 thread 的封装,使得多线程的...

    权重衰减(weight decay)与学习率衰减(learning rate decay).docx

    权重衰减(Weight Decay)与学习率衰减(Learning Rate Decay)是深度学习和机器学习中常见的优化策略,用于改善模型的性能并防止过拟合。 权重衰减,也称为L2正则化,是一种正则化技术,其目的是限制模型参数的...

    放射性核素衰变查询工具软件decay

    放射性核素衰变查询工具软件“decay”是一款专门针对核物理学领域的实用工具,它提供了详尽的放射性核素衰变信息,包括衰变链、分支比等关键数据。这款软件尤其适用于科研人员、工程师以及对核能或放射性物质感兴趣...

    Weight Decay超参的理解.docx

    Weight Decay超参的理解

    Programming in C++ for Engineering and Science

    These problems include radioactive decay, pollution indexes, digital circuits, differential equations, Internet addresses, data analysis, simulation, quality control, electrical networks, data ...

    基本语言特性使用auto结构化绑定不会发生类型退化(decay)

    在C++11标准中,auto关键字的使用范围扩展到了泛型编程中,可以用来声明泛型变量。 在泛型编程中,auto关键字可以用来声明变量的类型,而不需要明确指定变量的类型。例如: ```cpp auto x = 5; // x的类型是int ...

    Chic_decay

    "Chic_decay"这个标题可能代表一种独特的字体风格,可能是设计师为了创造出具有时尚感和残缺美效果的字体而命名的。这种字体可能适用于时尚杂志、艺术设计、网页界面或品牌标识等场合,旨在吸引观众的注意力并传达...

    C++蚁群算法求解TSP问题

    为了优化性能,可能还需要引入一些改进策略,如 elitism(保留部分优质路径)、local search(局部搜索优化)和 pheromone trail decay rate调整(信息素蒸发率)等。 在实际应用中,C++实现的蚁群算法不仅可以解决...

    增加weight-decay可以增加梯度吗?

    过小的weight_decay可能导致过拟合,而过大的weight_decay则可能导致欠拟合,使得模型无法充分利用训练数据。因此,选择合适的weight_decay至关重要,通常需要通过交叉验证或网格搜索等方法来确定。 总的来说,...

    matlab multiple decay rates.m

    matlab m文件

    C++基础之模板.pdf

    2. `declval`:一个未定义的辅助函数,用于在不创建对象的情况下得到其类型的临时对象,通常与`decltype`一起使用。 3. `integral_constant`:`std::integral_constant` 是模板类模板,用于创建表示常量的类型别名。...

    Thinking Particles Tutorial - Ash Decay教程

    ### Thinking Particles Tutorial - Ash Decay 教程 在数字特效领域,Thinking Particles(以下简称TP)是一款非常强大的粒子系统模拟软件。它不仅被广泛应用于电影特效制作中,还深受游戏开发者的喜爱。本次...

    com.elevatecumbe.decay.apk

    com.elevatecumbe.decay.apk

    decay:著名的基于投票受欢迎度和时间的排序算法为PHP实现

    $ date = '2015-11-01 01:01:01' ; $ gravity = 1.8 ; $ votes = 100 ; $ z = 1.96 ; /** * Reddit */ $ redditHot = $ c -&gt; redditHot ( $ decay , $ ups , $ down , $ date ); echo $ redditHot . "\n" ; /** *...

    tf.train.exponential_decay()的理解与实践

    `tf.train.exponential_decay()` 是 TensorFlow 库中用于实现学习率衰减的函数,它可以帮助我们动态调整学习率,从而改进模型的训练效果。 `tf.train.exponential_decay()` 函数的使用方法如下: ```python tf....

    pangolin压缩包

    此外,你可能会看到`.cpp`、`.h`、`.c`或`.cc`等文件,这些都是C++源代码文件;`.py`可能是Python脚本;`.sh`是Shell脚本,用于自动化任务。 在开源项目中,`git`是一个至关重要的工具,它是分布式版本控制系统,...

Global site tag (gtag.js) - Google Analytics