【发布时间】:2018-05-28 07:28:48
【问题描述】:
我正在学习如何使用std::enable_if,到目前为止,我在有条件地启用和禁用我的课程中的方法方面取得了一定程度的成功。我将方法模板化为布尔值,并且此类方法的返回类型是此类布尔值的std::enable_if。这里的最小工作示例:
#include <array>
#include <iostream>
#include <type_traits>
struct input {};
struct output {};
template <class io> struct is_input { static constexpr bool value = false; };
template <> struct is_input<input> { static constexpr bool value = true; };
template <class float_t, class io, size_t n> class Base {
private:
std::array<float_t, n> x_{};
public:
Base() = default;
Base(std::array<float_t, n> x) : x_(std::move(x)) {}
template <class... T> Base(T... list) : x_{static_cast<float_t>(list)...} {}
// Disable the getter if it is an input class
template <bool b = !is_input<io>::value>
typename std::enable_if<b>::type get(std::array<float_t, n> &x) {
x = x_;
}
// Disable the setter if it is an output class
template <bool b = is_input<io>::value>
typename std::enable_if<b>::type set(const std::array<float_t, n> &x) {
x_ = x;
}
};
int main() {
Base<double, input, 5> A{1, 2, 3, 4, 5};
Base<double, output, 3> B{3, 9, 27};
std::array<double, 5> a{5, 6, 7, 8, 9};
std::array<double, 3> b{1, 1, 1};
// A.get(a); Getter disabled for input class
A.set(a);
B.get(b);
// B.set(b); Setter disabled for input class
return 0;
}
但是,我不能应用此过程来有条件地启用 构造函数,因为它们没有返回类型。我已尝试针对 std::enable_if 的值进行模板化,但该类无法编译:
template <class io> class Base{
private:
float_t x_;
public:
template <class x = typename std::enable_if<std::is_equal<io,input>::value>::type> Base() : x_{5.55} {}
}
编译器错误如下:
In instantiation of ‘struct Base<output>’ -- no type named ‘type’ in ‘struct std::enable_if<false, void>’
正如in this other post 所解释的,当一个类模板被实例化时,它会实例化它的所有成员声明(尽管不一定是它们的定义)。该构造函数的声明格式不正确,因此无法实例化该类。
您将如何规避此问题?我感谢任何帮助:)
编辑:
我想要以下内容:
struct positive{};
struct negative{};
template <class float_t, class io> class Base{
private:
float_t x_;
public:
template <class T = io, typename = typename std::enable_if<
std::is_same<T, positive>::value>::type>
Base(x) : x_(x) {}
template <class T = io, typename = typename std::enable_if<
std::is_same<T, negative>::value>::type>
Base(x) : x_(-x) {}
如果可能的话。
【问题讨论】:
-
投反对票的人能否解释一下他投反对票的原因?
-
可能是因为简单的搜索找到了重复项。
-
那么为什么不关闭重复呢?
标签: c++ constructor enable-if