我有一个类模板,我似乎无法弄清楚如何执行Variadic Template样式实例化。
到目前为止,这是我正在寻找的“代码”:
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;
};
显然这不会编译:)。我们的想法是创建一个类,它可以在构造函数中存储传入的值(如果有的话......它可能只有_Classname / U定义),以便稍后可以检索它们以传递给另一个函数中的m_Functor。
首先:Variadic模板甚至可以在VS2010中完成吗?我只是使用行error C2143: syntax error : missing ',' before '...'
template<typename _Classname, typename... Args>
来解决编译问题
其次,我想要完成的事情可以完成吗?谢谢!
答案 0 :(得分:26)
Visual C ++ 2010不支持可变参数模板。
答案 1 :(得分:3)
我相信以下内容会做你想要的。首先,你需要一个实用程序:
// 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;
};
然后你可以使用它来帮助你扩展一个持有你的参数的元组:
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)...);
}
};
至于VS2010可变参数模板支持:我不知道。
答案 2 :(得分:-2)
Variadic模板是对黑客攻击的补丁 - 你不会喜欢这个。这样做的方法(在我的头脑中)是使用模板特化与继承。这些方面的东西:
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;
};
我以前从未这样做,也没有测试过,但这是一般的想法。您可以查看实际工作的std::tuple
实现。