有两个“C”函数:
void fooA(const char*);
void fooW(const wchar_t*);
然后是一个包装模板函数:
template<typename _TChar>
void foo(const _TChar* str)
{
// call fooA or fooB based on actual type of _TChar
// std::conditional .. ?
// fooA(str);
// fooW(str);
}
如果调用者调用 foo("Abc")
,这个模板函数应该在编译时调用 fooA
。同样, foo(L"Abc")
应该最终调用 fooW
。
我怎么做?我想过使用 std::conditional
但做不到。
我不能使 fooA
或 fooB
重载,因为这些是 C 函数。
原文由 Ajay 发布,翻译遵循 CC BY-SA 4.0 许可协议
您可以将 所有
wchar_t
版本放在一个类模板中,比如overloads
及其char
在其专业化中的对应部分,如下所示:然后您可以将它们用作:
表达式 SFINAE 让一切变得简单!
另一种方法是使用 Expression SFINAE ,它不需要您编写类似
overloads
的任何内容,并且可以用更少的代码完成相同的工作:然后你可以实现
invokeOne
为:看看 在线演示。
在这种方法中,您不必将重载添加到
overloads
类模板 及其 特化中。相反,您只需将它们作为参数传递给invokeOne
它会为您调用正确的重载。希望有帮助。