该std::align_val_t
类型定义为:
namespace std
{
enum class align_val_t : size_t
{
};
}
这样一个空枚举的用途是什么?
和 有什么区别typedef
?
该std::align_val_t
类型定义为:
namespace std
{
enum class align_val_t : size_t
{
};
}
这样一个空枚举的用途是什么?
和 有什么区别typedef
?
我正在阅读 Nicolai M. Josuttis 的《C++17 - 完整指南》一书。
第 14 章的标题是“使用可变参数声明”。我不明白其中的示例代码:
// Part 1: "inherit" all function call operators of passed based types:
template<typename... Ts>
struct overload : Ts...
{
using Ts::operator()...;
}
// Part 2: base types are deduced from passed arguments
// >>>> What is it ?? -> see answer from Ted Lyngmo
// EDIT: That's also based on the fact that overload can use
// aggregate initialization, and so that overload can be
// instancied with a constructor with any number and types
// (but we have to help it to deduce the types).
template<typename... Ts>
overload(Ts...) -> overload<Ts...>;
// Part 3
auto twice = overload {
[](std::string& s) { s += s; }
[](auto& v) { v *= 2; }
};
代码分为3个部分:
第 1 部分:我知道我们声明一个最终将具有 3 个函数调用运算符的类。
第 2 部分:我不明白这一点…… - 我们在这里声明什么?你能解释一下语法吗,尤其是overload(Ts...)
?
第 3 部分:我们使用聚合初始化来初始化基类函数调用运算符。
如果我必须再次阅读前面的章节,请告诉我哪一章!
我想知道是否有可能只用一条指令而不是 lambda 来调用容器中的回调(这是一种练习)。
我尝试了std::invoke
。这是我的代码:
#include <algorithm>
#include <functional>
#include <iostream>
int main()
{
std::function<void(void)> foo = []() { std::cout << "Foo !"; };
std::function<void(void)> bar = []() { std::cout << "Bar !"; };
const std::vector<std::function<void(void)>> callbacks = { foo, bar };
std::for_each(callbacks.cbegin(), callbacks.cend(), std::invoke);
return 0;
}
但我在编译时遇到很多错误:
main.cpp: In function ‘int main()’:
main.cpp:12:22: error: no matching function for call to ‘for_each(std::vector >::const_iterator, std::vector >::const_iterator, )’
12 | std::for_each(callbacks.cbegin(), callbacks.cend(), std::invoke);
| ~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/include/c++/11/algorithm:62,
from main.cpp:1:
/usr/include/c++/11/bits/stl_algo.h:3814:5: note: candidate: ‘template _Funct std::for_each(_IIter, _IIter, _Funct)’
3814 | for_each(_InputIterator __first, _InputIterator __last, _Function __f)
| ^~~~~~~~
/usr/include/c++/11/bits/stl_algo.h:3814:5: note: template argument deduction/substitution failed:
main.cpp:12:22: note: couldn’t deduce template parameter ‘_Funct’
12 | std::for_each(callbacks.cbegin(), callbacks.cend(), std::invoke);
| ~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/include/c++/11/algorithm:74,
from main.cpp:1:
/usr/include/c++/11/pstl/glue_algorithm_defs.h:42:1: note: candidate: ‘template __pstl::__internal::__enable_if_execution_policy<_ExecutionPolicy, void> std::for_each(_ExecutionPolicy&&, _ForwardIterator, _ForwardIterator, _Function)’
42 | for_each(_ExecutionPolicy&& __exec, _ForwardIterator __first, _ForwardIterator __last, _Function __f);
| ^~~~~~~~
/usr/include/c++/11/pstl/glue_algorithm_defs.h:42:1: note: template argument deduction/substitution failed:
main.cpp:12:22: note: candidate expects 4 arguments, 3 provided
12 | std::for_each(callbacks.cbegin(), callbacks.cend(), std::invoke);
| ~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Call Stack
# Function File:Line
Local Variables
Variable Value
Registers
Register Value
Display Expressions
Expression Value
Breakpoints and Watchpoints
# Description
我也尝试过这样的方式:
std::for_each(callbacks.cbegin(), callbacks.cend(), std::invoke<void(void)>);
但我仍然有问题:
In file included from /usr/include/c++/11/algorithm:62,
from main.cpp:1:
/usr/include/c++/11/bits/stl_algo.h: In instantiation of ‘_Funct std::for_each(_IIter, _IIter, _Funct) [with _IIter = __gnu_cxx::__normal_iterator<const std::function<void()>*, std::vector<std::function<void()> > >; _Funct = void (*)(void (&&)())]’:
main.cpp:12:15: required from here
/usr/include/c++/11/bits/stl_algo.h:3820:12: error: invalid initialization of reference of type ‘void (&&)()’ from expression of type ‘const std::function’
3820 | __f(*__first);
| ~~~^~~~~~~~~~