我有一个Builder类,它有许多set方法(有各种名称和参数)。我需要允许调用最多4个这样的方法,而不是更多。如果调用超过4个set函数,我显然会生成运行时错误,但我想生成编译器错误。这将是一个编程错误,我希望有机会修复它(决定我要保留哪4个调用)而不是等到它运行时失败(在这种情况下我必须做一些任意的事情,比如忽略第五个)。我需要一个使用标准C ++的解决方案,但不需要新的C ++ 11功能。下面是5个调用的示例(应该在第五个调用时生成编译器错误)。
Builder builder();
builder.setA(1);
builder.setB(1.3);
builder.setC("sss");
builder.setD(0);
builder.setE(3, "aaa");
答案 0 :(得分:2)
您可以使用以下内容:
template <typename T, int N>
struct result {
T values[N];
};
template <typename T, int I, int N>
class builder_ {
T* values;
friend class builder_<T, I - 1, N>;
builder_(T* values): values(values) {}
public:
builder_(result<T, N>& r): values(r.values) {}
builder_<T, I + 1, N> set(T const& value) {
*values = value;
return builder_<T, I + 1, N>(this->values + 1);
}
};
template <typename T, int N>
class builder_<T, N, N> {
public:
builder_(T*) {}
};
template <typename T, int N>
builder_<T, 0, N> builder(result<T, N>& r) {
return builder_<T, 0, N>(r);
}
int main()
{
result<int, 4> r;
builder(r)
.set(1)
.set(2)
.set(3)
.set(4)
;
}