相关疑难解决方法(0)

"解包"一个元组来调用匹配的函数指针

我正在尝试存储std::tuple不同数量的值,这些值稍后将用作调用与存储类型匹配的函数指针的参数.

我创建了一个简化的示例,显示了我正在努力解决的问题:

#include <iostream>
#include <tuple>

void f(int a, double b, void* c) {
  std::cout << a << ":" << b << ":" << c << std::endl;
}

template <typename ...Args>
struct save_it_for_later {
  std::tuple<Args...> params;
  void (*func)(Args...);

  void delayed_dispatch() {
     // How can I "unpack" params to call func?
     func(std::get<0>(params), std::get<1>(params), std::get<2>(params));
     // But I *really* don't want to write 20 versions of dispatch so I'd rather 
     // write something like:
     func(params...); // Not legal
  }
}; …
Run Code Online (Sandbox Code Playgroud)

c++ function-pointers variadic-templates c++11 iterable-unpacking

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

我们可以通过C++编译器看到模板实例化的代码

有没有办法知道模板函数或C++中的类的编译器实例化代码

假设我有以下代码

template < class T> T add(T a, T b){
            return a+b;
}
Run Code Online (Sandbox Code Playgroud)

现在我打电话的时候

add<int>(10,2); 
Run Code Online (Sandbox Code Playgroud)

我想知道编译器为int特定版本创建的函数.

我正在使用G ++,VC++.如果有些人可以帮我指出编译器选项来实现这一点,将会很有帮助.

希望问题很清楚.提前致谢.

c++

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

如何反转可变参数模板函数的参数顺序?

我有一个带有varargs模板参数模板函数,就像这样

template<typename Args...>
void ascendingPrint(Args... args) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

我想写

template<typename Args...>
void descendingPrint(Args... args) {
  /* implementation using ascendingPrint()? */
}
Run Code Online (Sandbox Code Playgroud)

如何在传递参数包之前反转参数包 的顺序args,即在伪代码中:

template<typename Args...>
void descendingPrint(Args... args) {
  ascendingPrint( reverse(args) );
}
Run Code Online (Sandbox Code Playgroud)

c++ templates variadic-functions variadic-templates c++11

32
推荐指数
5
解决办法
7028
查看次数

变量模板,参数包及其在参数列表中讨论的歧义

在这个问题中,我将参考我之前的问题.

在那个问题中,我发现以下内容无效:

template<typename T, typename... A, typename S>
class C { };
Run Code Online (Sandbox Code Playgroud)

这是因为:

[它不是有效的代码]用于类模板,因为必须始终指定它们的参数,这将始终导致歧义,除非参数包在最后并且填充任何剩余的模板参数.

这是有道理的,当然,我得到了它.

然后,作为替代方法,提出了涉及专业化的以下内容:

template<typename F, typename S>
class C;

template<typename T, typename... A, typename S>
class C<T(A...), S> { };
Run Code Online (Sandbox Code Playgroud)

实际上,它似乎有效,所以感谢提出它的人.

无论如何,我不明白为什么这是有效的代码,而前一个不是.
它是否应该受到先前解决方案的模糊性的影响?在这种情况下,编译器为什么以及如何解决这种模糊性?
根据上一个问题(参见本问题开头的链接),在我看来,仍然可变参数部分应该将任何参数填充到最后,因此该代码也不应该是有效的.
当然,我错了,但在我的推理中究竟出了什么问题?

c++ templates variadic-templates c++11

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