我有一个C ++模板函数:
template<typename Input, typename Output>
void Process(const Input &in, Output *out) {
...
}
如果使用不同类型的容器调用它,如何使用友好的错误消息使其成为编译错误?例如,调用set<int> sout; Process(vector<int>(), &sout);
应该有效,但vector<unsigned> vout; Process(vector<int>(), &vout);
应该是编译错误。
如果用不可相互转换的容器调用它,如何使用友好的错误消息使其成为编译错误?例如,上面的调用应该有效,但struct A {}; struct B {}; vector<B> vbout; Process(vector<A>(), &vbout);
应该是编译错误。 `
答案 0 :(得分:9)
您可以static_assert()
只知道两种类型的value_type
是相同的:
static_assert(std::is_same<typename Input::value_type, typename Output::value_type>::value,
"the containers passed to Process() need to have the same value_type");
如果您希望自己的类型可以兑换,请改用std::is_convertible
:
static_assert(std::is_convertible<typename Input::value_type, typename Output::value_type>::value,
"the value_type of the source container passed to Process() needs to be convertible to the value_type of the target container");