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新特性解析与应用》这本书是C++编程领域的一本经典著作,旨在帮助读者全面掌握C++11标准带来的诸多新特性和改进。C++11是C++语言的一个重大更新,引入了许多现代化的编程特性,提升了代码的...
C++11 封装 Thread 库的方法示例 在 C++11 中,std::thread 提供了对多线程的支持,然而不同的平台提供了不同线程 API,这使得代码移植变得困难。为了解决这个问题,C++11 提供了对 thread 的封装,使得多线程的...
权重衰减(Weight Decay)与学习率衰减(Learning Rate Decay)是深度学习和机器学习中常见的优化策略,用于改善模型的性能并防止过拟合。 权重衰减,也称为L2正则化,是一种正则化技术,其目的是限制模型参数的...
Weight Decay超参的理解
These problems include radioactive decay, pollution indexes, digital circuits, differential equations, Internet addresses, data analysis, simulation, quality control, electrical networks, data ...
放射性核素衰变查询工具软件“decay”是一款专门针对核物理学领域的实用工具,它提供了详尽的放射性核素衰变信息,包括衰变链、分支比等关键数据。这款软件尤其适用于科研人员、工程师以及对核能或放射性物质感兴趣...
在C++11标准中,auto关键字的使用范围扩展到了泛型编程中,可以用来声明泛型变量。 在泛型编程中,auto关键字可以用来声明变量的类型,而不需要明确指定变量的类型。例如: ```cpp auto x = 5; // x的类型是int ...
"Chic_decay"这个标题可能代表一种独特的字体风格,可能是设计师为了创造出具有时尚感和残缺美效果的字体而命名的。这种字体可能适用于时尚杂志、艺术设计、网页界面或品牌标识等场合,旨在吸引观众的注意力并传达...
为了优化性能,可能还需要引入一些改进策略,如 elitism(保留部分优质路径)、local search(局部搜索优化)和 pheromone trail decay rate调整(信息素蒸发率)等。 在实际应用中,C++实现的蚁群算法不仅可以解决...
过小的weight_decay可能导致过拟合,而过大的weight_decay则可能导致欠拟合,使得模型无法充分利用训练数据。因此,选择合适的weight_decay至关重要,通常需要通过交叉验证或网格搜索等方法来确定。 总的来说,...
matlab m文件
2. `declval`:一个未定义的辅助函数,用于在不创建对象的情况下得到其类型的临时对象,通常与`decltype`一起使用。 3. `integral_constant`:`std::integral_constant` 是模板类模板,用于创建表示常量的类型别名。...
### Thinking Particles Tutorial - Ash Decay 教程 在数字特效领域,Thinking Particles(以下简称TP)是一款非常强大的粒子系统模拟软件。它不仅被广泛应用于电影特效制作中,还深受游戏开发者的喜爱。本次...
com.elevatecumbe.decay.apk
$ date = '2015-11-01 01:01:01' ; $ gravity = 1.8 ; $ votes = 100 ; $ z = 1.96 ; /** * Reddit */ $ redditHot = $ c -> redditHot ( $ decay , $ ups , $ down , $ date ); echo $ redditHot . "\n" ; /** *...
`tf.train.exponential_decay()` 是 TensorFlow 库中用于实现学习率衰减的函数,它可以帮助我们动态调整学习率,从而改进模型的训练效果。 `tf.train.exponential_decay()` 函数的使用方法如下: ```python tf....
此外,你可能会看到`.cpp`、`.h`、`.c`或`.cc`等文件,这些都是C++源代码文件;`.py`可能是Python脚本;`.sh`是Shell脚本,用于自动化任务。 在开源项目中,`git`是一个至关重要的工具,它是分布式版本控制系统,...