的伪代码:
struct Time {
// constructor from zero
constexpr T(const int i)
: m_(i) {
static_assert(i == 0, "Can only construct from zero");
}
// other constructors from seconds, microseconds, etc.
int m_{};
};
int main() {
T t1(0); // correct
T t2(1); // incorrect
return 0;
}
这不是正确的代码(static_assert在编译时{(1}})无法使用非常量编译。它可以用任何其他方式编写吗?
UPD。我知道默认构造函数。这个问题是:在C ++中是否可以静态检查构造函数中的参数。
答案 0 :(得分:4)
您可以使用std::integral_constant
struct S {
constexpr S(std::integral_constant<int, 0> i)
: m_(i) {
static_assert(i == 0, "Can only construct from zero");
}
int m_{};
};
int main() {
S t1(std::integral_constant<int, 0>{}); // correct
//S t2(std::integral_constant<int, 1>{}); // incorrect
}
但是作为评论中的状态,为什么让事情变得复杂,而你可以简单地将你的成员初始化为0而没有那个参数。
答案 1 :(得分:3)
您可以使用decltype(nullptr)
(又名std::nullptr_t
):
#include <iostream>
struct Time
{
constexpr Time(decltype(nullptr)) {}
int m_{};
};
int main() {
Time t1(0);
Time t2(1); // error: no matching constructor for initialization of 'Time'
return 0;
}
请注意,此技巧不允许您执行int x = 0; Time t1(x);
。
答案 2 :(得分:2)
只需将其指定为零?
struct Time {
// constructor from zero
constexpr T(int i) //ignored
: m_(0) {}
}