class A
{
public:
using number_t = std::int32_t;
using string_t = std::string;
template < class T >
using vector_t = std::vector < T >;
public:
template < class T1, class T2, class T3 >
A(T1 && n, T2 && s, T3 && v) :
m_n { std::forward < T1 > (n) },
m_s { std::forward < T2 > (s) },
m_v { std::forward < T3 > (v) } {}
private:
number_t m_n;
string_t m_s;
vector_t < number_t > m_v;
};
问题:我需要在构造函数中检查T1,T2的类型吗?T3我认为这是必要的,因为这个构造函数很容易吃掉,例如,作为第一个参数double,这是不可取的。如何正确检查?我正在考虑std::enable_if_t和std::is_same。如果是这样,如果构造函数接受左值,如何删除引用?编译器抱怨std::is_same < number_t, std::remove_reference< T1 >::type >::value. 写道:“需要一种类型,而不是这个类型。”
在我看来,在这种情况下应用是合乎逻辑的
std::decay——比如顺便一提,
效果也很好。此外,在某些情况下它甚至更好——例如,它会
const intdecay通过删除来跳过它const,但现在它remove_reference_t不需要,因此,例如,如果构造函数需要一个引用,而不是一个常量引用,那么最好remove_reference_t是一个常量参考比较好decay。总之,在文件和某种母亲的帮助下调整到位...... :)
作为一种解决方案 - 您可以使用
std::is_convertible而不是std::is_same: