gpt4 book ai didi

c++如何减少相同模板特化的数量?

转载 作者:行者123 更新时间:2023-11-30 02:06:22 25 4
gpt4 key购买 nike

我有这个仿函数:

struct functor
{
template<class T> void operator()(T value) // (*)
{
// process the value
}
template<> void operator()<const wchar_t *>(const wchar_t *value) // (**)
{
if (value)
{
// process the value
}
}
template<> void operator()<const char *>(const char *value) // (**)
{
if (value)
{
// process the value
}
}
template<> void operator()<wchar_t *>(wchar_t *value) // (**)
{
if (value)
{
// process the value
}
}
template<> void operator()<char *>(char *value) // (**)
{
if (value)
{
// process the value
}
}
};

如您所见,我有 4 个相同的模板特化。是否有一种技术可以一次指定所有这些类型,这意味着以某种方式将所有可能的类型划分为主要组 (*) 和专用组 (**)?

谢谢。

编辑

糟糕,修正了一些拼写错误。

最佳答案

您可以使用更简单的方案 - 重载!

template<class T>
void foo(T value){ // general
// ...
}

template<class T>
void foo(T* value){ // for pointers!
if(value)
foo(*value); // forward to general implementation
}

另外,如果您不需要修改它(或者可能两者都需要,取决于您实际需要做什么),我建议将参数设置为引用 - const:

template<class T>
void foo(T& value){ // general, may modify parameter
// ...
}

template<class T>
void foo(T const& value){ // general, will not modify parameter
// ...
}

如果你想对一组特定类型有一个特殊的实现(即,对整个集合的一个实现),特征和标签调度可以帮助你:

// dispatch tags
struct non_ABC_tag{};
struct ABC_tag{};

class A; class B; class C;

template<class T>
struct get_tag{
typedef non_ABC_tag type;
};

// specialization on the members of the set
template<> struct get_tag<A>{ typedef ABC_tag type; };
template<> struct get_tag<B>{ typedef ABC_tag type; };
template<> struct get_tag<C>{ typedef ABC_tag type; };

// again, consider references for 'value' - see above
template<class T>
void foo(T value, non_ABC_tag){
// not A, B or C ...
}

template<class T>
void foo(T value, ABC_tag){
// A, B, or C ...
}

template<class T>
void foo(T value){
foo(value, typename get_tag<T>::type()); // dispatch
}

底线是,如果您想对没有任何共同点的类型进行分组,您至少需要一些重复(标记、重载...)。

关于c++如何减少相同模板特化的数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8842734/

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