gpt4 book ai didi

c++ - 基于模板参数类型的调用函数

转载 作者:IT老高 更新时间:2023-10-28 22:08:42 24 4
gpt4 key购买 nike

有两个“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 但没能成功。

我不能让 fooAfooB 重载,因为它们是 C 函数。

最佳答案

您可以将所有您的 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,它会为您调用正确的重载。

希望对您有所帮助。

关于c++ - 基于模板参数类型的调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40546553/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com