C++ VS2010 C++;可变模板示例

C++ VS2010 C++;可变模板示例,c++,visual-studio-2010,templates,variadic,C++,Visual Studio 2010,Templates,Variadic,我有一个类模板,我似乎不知道如何执行可变模板样式的实例化 以下是我目前正在寻找的“代码”: template<typename _Classname, typename... Args> class CFunctorStartExT { friend class CXXFactory; protected: template<typename U> CFunctorStartExT(typename U& _functor, Args&...

我有一个类模板,我似乎不知道如何执行可变模板样式的实例化

以下是我目前正在寻找的“代码”:

template<typename _Classname, typename... Args>
class CFunctorStartExT 
{
  friend class CXXFactory;
protected:
  template<typename U>
  CFunctorStartExT(typename U& _functor, Args&... args) :
    m_Functor(_functor),
    m_args(args)
  {
  }
  virtual bool ProcessLoop(CSomeClass* pThread)
  {
    return m_Functor(pThread, m_args);
  }

protected:
  _Classname& m_Functor;
  Args... m_args;
};
模板
类CFunctorStartExT
{
朋友级CXX工厂;
受保护的:
模板
CFunctorStartExT(类型名U&_函子,Args&…Args):
m_函子(_函子),
m_args(args)
{
}
虚拟bool ProcessLoop(CSomeClass*pThread)
{
返回m_函子(pThread,m_args);
}
受保护的:
_类名&m_函子;
Args…m_Args;
};
显然这不会编译:)。其思想是创建一个类,该类可以存储传入的值(如果有的话)。它可能只是在构造函数上定义了_Classname/U),以便以后可以检索这些值并传递给另一个函数中的m_Functor

第一:可变模板能在VS2010中实现吗?我只是在模板声明
错误C2143:语法错误:缺少“,”在“…”之前“
中遇到编译问题


第二,我想完成的事情能完成吗?谢谢< P>模板是一个补丁上的一个补丁上的黑客-你不会享受这个。实现这一点的方法(我想不起来)是将模板专门化与继承结合使用。大致如下:

template<typename Classname, typename... Args>
class CFunctorStartExT;

template<typename Classname, typename Arg0, typename... Args>
class CFunctorStartExT : private CFunctorStartExT<Classname, Args...> {
protected:
  Arg0 m_arg;
};

template<typename Classname>
class CFunctorStartExT {
protected:
  Classname &m_Functor;
};
模板
类CFunctorStartExT;
模板
类CFunctorStartExT:private CFunctorStartExT{
受保护的:
Arg0 m_arg;
};
模板
类CFunctorStartExT{
受保护的:
类名&m_函子;
};

我以前从来没有这样做过,也没有测试过,但这是总体思路。您可以查看一下std::tuple的实现,了解一些实际有效的东西。

我相信下面的内容可以满足您的需要。首先,您需要一个实用程序:

// make_tuple_indices

template <size_t...> struct tuple_indices {};

template <size_t _Sp, class _IntTuple, size_t _Ep>
struct make_indices_imp;

template <size_t _Sp, size_t ..._Indices, size_t _Ep>
struct make_indices_imp<_Sp, tuple_indices<_Indices...>, _Ep>
{
    typedef typename make_indices_imp<_Sp+1, tuple_indices<_Indices..., _Sp>, _Ep>::type type;
};

template <size_t _Ep, size_t ..._Indices>
struct make_indices_imp<_Ep, tuple_indices<_Indices...>, _Ep>
{
    typedef tuple_indices<_Indices...> type;
};

template <size_t _Ep, size_t _Sp = 0>
struct make_tuple_indices
{
    static_assert(_Sp <= _Ep, "make_tuple_indices input error");
    typedef typename make_indices_imp<_Sp, tuple_indices<>, _Ep>::type type;
};
//生成元组索引
模板结构元组索引{};
模板
结构生成索引导入;
模板
结构生成索引导入
{
typedef typename make_index_imp::type type;
};
模板
结构生成索引导入
{
typedef元组索引类型;
};
模板
结构生成元组索引
{

static_assert(_Sp名称以下划线开头,后跟大写字母,如
_Classname
)是保留的,您不应该在程序中使用它们。哦..保留给什么/谁?我一直在尝试更改我的命名约定..(从m、g等更改)请参见。lol..bummer..:(无论如何,要通过可变宏完成我正在做的事情?我知道std::make_shared具有可变的风格,但我在所有的定义中都迷失了方向。这是否意味着微软的某个人做了大量的复制和粘贴来获得有限的结果?不……他们有这种非常复杂的宏定义“机制”定义和取消定义以创建必要的类..据我所知。为了完整性起见,您可以在文件xxshared、xfwrap和xfwrap1等中看到它:@James McNellis:显然它们不在VS11中。如果VS2010可以支持“typename…”这将非常好谢谢,这解决了我需要帮助的一个非常类似的场景。在类似麻省理工学院的许可库中包含您的tuple_index/make_tuple_index代码可以吗?许可证可以在这里查看:上面显示的代码实际上已经是麻省理工学院许可的,尽管我没有为这段代码的许可证操心,这是一种常见的技术。下面是w这里它来自:在标题_元组中:。如果你能在_元组中包含版权和对LICENSE.TXT的引用,那就太好了。再次感谢。我将期待将来关于这些“常用技术”的文章为了有效地使用可变模板。我才刚刚开始使用它们,虽然我的代码在可变模板(而不是预处理器)上更加清晰,我很失望地发现,没有语言级别的工具来获取扩展参数/参数的索引。毫无疑问,随着C++11即将获得批准,将会有大量新书问世。
template<typename _Classname, typename... Args>
class CFunctorStartExT 
{
  friend class CXXFactory;
protected:
  template<typename U>
  CFunctorStartExT(U& _functor, Args&... args) :
    m_Functor(_functor),
    m_args(args...)
  {
  }

  virtual bool ProcessLoop(CSomeClass* pThread)
  {
    return ProcessLoop(pThread,
                       typename make_tuple_indices<sizeof...(Args)>::type());
  }

protected:
  _Classname& m_Functor;
  std::tuple<Args...> m_args;

private:
    template <std::size_t ...Indx>
    bool ProcessLoop(CSomeClass* pThread, tuple_indices<Indx...>)
    {
        return m_Functor(pThread, std::get<Indx>(m_args)...);
    }
};