auto
在C++ 14标准中,通用lambda如何工作(关键字作为参数类型)?
它是基于C++模板的,每个不同的参数类型编译器生成一个具有相同主体但替换类型(编译时多态)的新函数,还是更类似于Java的泛型(类型擦除)?
代码示例:
auto glambda = [](auto a) { return a; };
Run Code Online (Sandbox Code Playgroud) 我想要做
template<typename... ArgTypes> void print(ArgTypes... Args)
{
print(Args)...;
}
Run Code Online (Sandbox Code Playgroud)
并且它相当于这个相当庞大的递归链:
template<typename T, typename... ArgTypes> void print(const T& t, ArgTypes... Args)
{
print(t);
print(Args...);
}
Run Code Online (Sandbox Code Playgroud)
然后是我想要打印的每种类型的显式单参数专精.
递归实现的"问题"是生成了大量冗余代码,因为每个递归步骤都会产生一个新的N-1
参数函数,而我想要的代码只会为单个N
-arg print
函数生成代码,并且具有最多的N
专业print
功能.
如何创建递归可变参数模板以打印出参数包的内容?我正在尝试这个,但它无法编译:
template <typename First, typename ...Args>
std::string type_name () {
return std::string(typeid(First).name()) + " " + type_name<Args...>();
}
std::string type_name () {
return "";
}
Run Code Online (Sandbox Code Playgroud)
我该如何结束递归?
使用逗号分隔的参数包的最简单方法是什么std::ostream
?
例:
template<typename... Args>
void doPrint(std::ostream& out, Args... args){
out << args...; // WRONG! What to write here?
}
// Usage:
int main(){
doPrint(std::cout,34,"bla",15); // Should print: 34,bla,15
}
Run Code Online (Sandbox Code Playgroud)
注意:可以假设<<
操作员的相应过载可用于所有类型的参数包.
我看到了这个漂亮的图形,它根据不同的数据要求对哪个STL容器进行分类,例如:
- 固定尺寸Vs可变尺寸
- 相同tyme的数据Vs不同类型
- 排序Vs未排序的数据
- 顺序Vs随机访问
http://plasmahh.projectiwear.org/cce_clean.svg
我在那张图片中注意到,C++ STL没有容器
C++有没有这方面的东西?
PS - 容器的不同属性可以有许多排列,STL也可能没有提供许多其他属性.
~scoped_lock()
{ std::apply([](auto&... __m) { (__m.unlock(), ...); }, _M_devices); }
Run Code Online (Sandbox Code Playgroud)
如何理解[](auto&... __m) { (__m.unlock(), ...);
?我不明白...
lambda 中的内容,也不知道它如何以相反的顺序实现释放互斥体。
正如@HolyBlackCat所说,
(__m.unlock(), ...)
意味着(__m1.unlock(),(__m2.unlock(), (__m3.unlock(), (...))))
,但它并没有实现逆序解锁。
在 cppreference.com 中:
当控制权离开创建scoped_lock对象的作用域时,scoped_lock将被破坏,互斥体将被释放,以相反的顺序。
我做了一个实验来证实这一点,如下:
~scoped_lock()
{ std::apply([](auto&... __m) { (__m.unlock(), ...); }, _M_devices); }
Run Code Online (Sandbox Code Playgroud)
mutex 1 locked
mutex 2 try locked
mutex 3 try locked
1: 0
mutex 1 unlocked
mutex 2 unlocked
mutex 3 unlocked
Run Code Online (Sandbox Code Playgroud)
那么cppreference会出错吗?
在Python中,可以存储具有不同数量参数的函数指针,并将参数存储在列表中,然后解压列表并调用该函数,如下所示:
\ndef Func(x1, x2):\n return x1+x2\nArgList = [1.2, 3.22]\nMyClass.Store(Func)\nMyClass.FuncPtr(*ArgList)\n
Run Code Online (Sandbox Code Playgroud)\n在c++中是否可以做类似的事情?
\n例如,将具有可变数量的输入和值的函数存储在 a 中,std::vector
并通过该向量调用函数指针?
我不想将参数列表定义为向量。
\n