我有以下 C++ 代码来测试我们在将参数委托给不同类型对象的构造函数时使用的完美转发:
#include <iostream>
// THIS CLASS TAKES 2 ARGUMENTS.
struct A {
A(int i, int j) {
i = i;
j = j;
}
int i;
int j;
};
// THIS CLASS TAKES 3 ARGUMENTS.
struct B {
B(int i, int j, int k) {
i = i;
j = j;
k = k;
}
int i;
int j;
int k;
};
// THIS CLASS IS A VARIANT-LIKE DELEGATOR
// WHOSE FIRST ARGUMENT IS THE TYPE TAG,
// AND THE REST ARE FORWARDED TO THE CORRESPONDING CLASS.
struct Delegator {
enum class Type : int {
CLASS_A,
CLASS_B
};
union {
A a;
B b;
};
template <typename... Args>
Delegator(Delegator::Type type, Args... args) {
type_ = type;
if (type_ == Delegator::Type::CLASS_A) {
new (&a) A(std::forward(args...));
} else if (type_ == Delegator::Type::CLASS_B) {
new (&b) B(std::forward(args...));
} else {
throw std::invalid_argument("Delegator constructor: "
"forwarded arguments does not match any of its member type constructors!");
}
}
private:
Delegator::Type type_;
};
int main() {
// THIS IS GOOD.
Delegator delegator(Delegator::Type::CLASS_A, 1, 2);
// THIS IS BAD.
Delegator delegator(Delegator::Type::CLASS_A, 1, 2, 3, 4);
}
我想知道——在处理这些类型的情况时,C++ 错误消息的当前状态是什么?有没有什么可以与 Scheme 提供的功能相媲美,(syntax-error)
以便对象的用户在使用不当时可以获得更好的错误消息?我不在乎使用什么 C++ 标准——我只想知道目前是否可以调整 C++ 的错误诊断消息。
程序员可以为未来的用户对这些冗长的模板代码错误消息做些什么吗?还是这一切都在编译器手中?