相关疑难解决方法(0)

通用lambda如何在C++ 14中工作?

auto在C++ 14标准中,通用lambda如何工作(关键字作为参数类型)?

它是基于C++模板的,每个不同的参数类型编译器生成一个具有相同主体但替换类型(编译时多态)的新函数,还是更类似于Java的泛型(类型擦除)?

代码示例:

auto glambda = [](auto a) { return a; };
Run Code Online (Sandbox Code Playgroud)

c++ lambda auto c++14

108
推荐指数
3
解决办法
4万
查看次数

如何在所有可变参数模板args上调用函数?

我想要做

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功能.

c++ variadic-templates c++11

43
推荐指数
3
解决办法
1万
查看次数

递归可变参数模板,用于打印参数包的内容

如何创建递归可变参数模板以打印出参数包的内容?我正在尝试这个,但它无法编译:

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)

我该如何结束递归?

recursion typeid variadic-templates c++11

40
推荐指数
6
解决办法
2万
查看次数

使用std :: ostream打印可变参数包的最简单方法是什么?

使用逗号分隔的参数包的最简单方法是什么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)

注意:可以假设<<操作员的相应过载可用于所有类型的参数包.

c++ templates variadic-templates c++11

25
推荐指数
4
解决办法
1万
查看次数

C++中的异构容器

我看到了这个漂亮的图形,它根据不同的数据要求对哪个STL容器进行分类,例如:

- 固定尺寸Vs可变尺寸

- 相同tyme的数据Vs不同类型

- 排序Vs未排序的数据

- 顺序Vs随机访问

http://plasmahh.projectiwear.org/cce_clean.svg

我在那张图片中注意到,C++ STL没有容器

  1. 可变尺寸
  2. 异类(不同类型的数据).

C++有没有这方面的东西?

PS - 容器的不同属性可以有许多排列,STL也可能没有提供许多其他属性.

c++ containers stl heterogeneous

23
推荐指数
3
解决办法
2万
查看次数

如何理解scoped_lock的析构函数?cppreference是否有错误?

 ~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会出错吗?

c++ scoped-lock c++17

4
推荐指数
1
解决办法
283
查看次数

如何存储和调用可变参数函数和值向量?

在Python中,可以存储具有不同数量参数的函数指针,并将参数存储在列表中,然后解压列表并调用该函数,如下所示:

\n
def 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

我不想将参数列表定义为向量。

\n

c++ templates class variadic-templates c++11

1
推荐指数
1
解决办法
1205
查看次数