【发布时间】:2017-04-05 14:16:18
【问题描述】:
我想创建一个模板类MyClass<T>,我想在其中有一个模板构造函数,它将接受MyClass<U> 类型的单个参数,只有当U 派生自T 时才有效(或与T 相同,在这种情况下本质上也充当复制构造函数)。如果不是,我想在编译时失败。此外,它还有第二个模板化成员函数MyClass<U> convert<U>() const,仅当U 派生自T(或与T 相同)时才有效。目前这些函数的实际实现并不重要,我现在只是想弄清楚如何声明它们。
虽然在某些情况下,可以使用 static_assert 和 std::is_base_of 而没有 std::enable_if 使编译失败,但我想知道是否可以使用 std:: enable_if。
提前致谢
【问题讨论】:
-
那么问题是什么?通常
enable_if是您用来约束模板的东西。绑了还是不行? -
首先确保您了解静态断言和约束模板之间的区别。前者导致硬错误,后者使您的构造函数可检测。也就是
is_constructible<MyClass<T>, Args...>这个问题有不同的答案,你需要先决定你想要什么样的行为。 -
我一直试图从我在 Stroustrup 的 C++ 编程语言第 4 版中找到的示例中进行概括,但没有任何运气......我已经尝试了几种排列,我可以想到,使用
std::is_base_of<T,U>和std::enable_if,但到目前为止我没有尝试过。我正在使用 gcc 5.3,并使用 -std=c++11 进行编译,所以我应该可以使用 C++11 功能。
标签: c++ c++11 templates enable-if