C++11 可变模板和向特定模板类的完美转发

C++11 可变模板和向特定模板类的完美转发,c++11,variadic-templates,perfect-forwarding,visual-c++-2013,C++11,Variadic Templates,Perfect Forwarding,Visual C++ 2013,我想在我的“myArgs类”中实现一个完美的转发构造函数, 它应该只涉及myClassBase的专门化。 粗略地说:为myClassBase 但它不会编译:'':无法从“myClass”转换为“myArgs”。 我认为这是因为编译器无法从Args&&推断到myClassBase template <class T> myArgs(T&& rhs) : m_data(std::forward<T>(rhs)) { } 请参见这个(非常基本的)示例:

我想在我的“myArgs类”中实现一个完美的转发构造函数, 它应该只涉及
myClassBase
的专门化。 粗略地说:为
myClassBase

但它不会编译:
'':无法从“myClass”转换为“myArgs”。

我认为这是因为编译器无法从
Args&&
推断到
myClassBase

template <class T>
myArgs(T&& rhs) :
    m_data(std::forward<T>(rhs))
{
}
请参见这个(非常基本的)示例:

如果我将var_args函数参数从
void var_args(args&&…args)
更改为
void var_args(args…args)
,它会工作

顺便说一句,在我的真实代码中,myClass当然支持移动语义

提前谢谢。 基督教徒

template <class T, class D>
myArgs(myClassBase<T, D>&& rhs) :
    m_data(std::forward< myClassBase<T, D> >(rhs))
{
}
如果希望此函数仅在
T
myClassBase
时有效,可以编写一个trait来检查它:

template <typename T>
struct isMyClassBaseImpl : std::false_type{};

template <typename T, typename D>
struct isMyClassBaseImpl<myClassBase<T,D>> : std::true_type{};

template <typename T>
using isMyClassBase = isMyClassBaseImpl<std::decay_t<T>>;
模板
struct isMyClassBaseImpl:std::false_type{};
模板
struct isMyClassBaseImpl:std::true_type{};
模板
使用isMyClassBase=isMyClassBaseImpl;
然后你可以把它弄清楚:

template <class T, std::enable_if_t<isMyClassBase<T>::value>* = nullptr>
myArgs(T&& rhs) :
    m_data(std::forward<T>(rhs))
{
}
模板
myArgs(T&&rhs):
m_数据(标准:正向(rhs))
{
}
template <typename T>
struct isMyClassBaseImpl : std::false_type{};

template <typename T, typename D>
struct isMyClassBaseImpl<myClassBase<T,D>> : std::true_type{};

template <typename T>
using isMyClassBase = isMyClassBaseImpl<std::decay_t<T>>;
template <class T, std::enable_if_t<isMyClassBase<T>::value>* = nullptr>
myArgs(T&& rhs) :
    m_data(std::forward<T>(rhs))
{
}