【问题标题】:Variadic template function composition [closed]可变参数模板函数组合
【发布时间】:2015-07-07 13:46:02
【问题描述】:

希望 stackoverflow 社区可以帮助我解决这个问题。我想要类似下面的编译

template <typename A>  
void VARIADIC_TEMPLATE_FUNCTION(A* tptr)
{   
    //Do nothing
}   

template <typename A, typename B, typename... C>
void VARIADIC_TEMPLATE_FUNCTION(A* tptr)
{   
    // Do stuff here with typename B and tptr (not included)
    VARIADIC_TEMPLATE_FUNCTION<A,C...>(tptr);
}   

显然这不起作用,两个函数的签名冲突。

我一直试图通过传递一些可变参数来解决这个问题,但似乎没有任何效果。我不反对传递“假”变量——但不反对。

调用者会做类似的事情(例如):

ClassP* ptr;
VARIADIC_TEMPLATE_FUNCTION<ClassP, ClassA, ClassB, ClassC, ClassD>(ptr);

【问题讨论】:

  • 你现在有什么问题?对于您显示的函数调用,应(递归)调用第二个重载 4 次,然后调用第一个重载一次。
  • 完美编译和运行
  • 也许您必须启用 C++11 支持。你用的是什么编译器?
  • 投票结束,因为 OP 不包括发生的具体问题(除了“显然这不起作用”)。
  • 呃,我不明白为什么我之前遇到过这个问题 - 它确实工作得很好。我应该在中午之前停止喝啤酒。

标签: c++ c++11 recursion variadic-templates c++14


【解决方案1】:

您编译的代码对我来说非常好,所以我不完全确定问题是什么。但是如果你想表达的是对包中的每种类型执行一些操作,我喜欢下面的方法:

template <typename B, typename A>
void impl(A* tptr) {
    // Do stuff here with typename B and tptr (not included)           
}

template <typename A, typename... Ts>
void VARIADIC_TEMPLATE_FUNCTION(A* tptr) {
    int unused[] = {0, (impl<Ts>(a), 0)... };
    (void)unused;
}

一旦您通过了我们正在介绍的 0s 的奇怪 int 数组,就会使意图更加清晰。

【讨论】:

  • 现在看起来像真正的黑客,但相当不错
  • 就在昨天我avoided recursion,今天就失败了。 #-P 为避免它投赞成票!
  • @DanielFrey 再说一遍:永远不要递归,再说一遍:永远不要递归,
  • @DanielFrey 你在swallow 的回答中不使用相同的技巧吗?
  • @Barry 是的。不是我不知道,只是很容易忘记应用它。我想,每当使用可变参数模板时,第一个反应就是使用递归,这是一个历史偶然。坏习惯很难改掉……
【解决方案2】:

把它变成你可以专攻的struct

template<typename...> struct IMPL;

template <typename A>
struct IMPL<A>
{
    static void apply(A* tptr)
    {   
        //Do nothing
    }   
};

template <typename A, typename B, typename... C>
struct IMPL<A,B,C...>
{
    static void apply(A* tptr)
    {   
        // Do stuff here with typename B and tptr (not included)
        IMPL<A,C...>::apply(tptr);
    }   
};

template <typename A, typename... Ts>
void VARIADIC_TEMPLATE_FUNCTION(A* tptr)
{
    IMPL<A,Ts...>::apply(tptr);
}

【讨论】:

  • 编辑:它不会因为静态,当然....但是,它似乎对 Paolo M 工作正常
  • @Creris 我不知道 OP 正在使用什么编译器以及它有什么确切的问题,以上内容通常对编译器来说更容易处理,所以它可能会有所帮助。我并不是说它应该是必要的。 :)
猜你喜欢
  • 1970-01-01
  • 2011-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-01
  • 2016-12-01
  • 2021-12-08
  • 1970-01-01
相关资源
最近更新 更多