您可以将所有您的wchar_t 版本放在类模板中,例如overloads 和它们的char 对应部分,如下所示:
template<typename WideCharVersion>
struct overloads
{
void foo(wchar_t const * arg)
{
FooW(arg);
}
//more wchar_t functions
};
template<>
struct overloads<std::false_type>
{
void foo(char const * arg)
{
FooA(arg);
}
//more char functions
};
//a friendly alias!
template<typename T>
using is_wide_char = typename std::is_same<whar_t, T>::type;
然后您可以将它们用作:
template<typename _TChar>
void foo(const _TChar* str)
{
overloads<is_wide_char<_TChar>>::foo(str);
}
表达 SFINAE 让一切变得简单!
另一种方法是使用Expression SFINAE,它不需要您编写类似overloads 的任何内容,并且可以用更少的代码完成相同的工作:
template<typename _TChar>
void foo(const _TChar* str)
{
invokeOne(fooA, fooW, str);
}
然后您可以将invokeOne 实现为:
template<typename F1, typename F2, typename ... Args>
auto invokeOne(F1 f1, F2 f2, Args && ... args) -> decltype(f1(args...))
{
return f1(args...);
}
template<typename F1, typename F2, typename ... Args>
auto invokeOne(F1 f1, F2 f2, Args && ... args) -> decltype(f2(args...))
{
return f2(args...);
}
看看online demo。
在这种方法中,您不必将重载添加到overloads 类模板和 到其特化中。相反,您只需将它们作为参数传递给 invokeOne,它会为您调用正确的重载。
希望对您有所帮助。