首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何正确删除模板函数中的代码重复

如何正确删除模板函数中的代码重复
EN

Stack Overflow用户
提问于 2016-09-03 20:49:14
回答 3查看 127关注 0票数 1

我有这样的代码(“宇宙飞船”-like操作符)。

代码语言:javascript
复制
template <class T>
int comparator(const T &a, const T &b){
    if (a < b){
        return -1;
    }else if (a > b){
        return +1;
    }

    return 0;
}

inline int comparator(const char *a, const char *b){
    return strcmp(a, b); // I never tried this, included just to get the idea
}

inline int comparator(char const a, char const b){
    return a - b;
}

inline int comparator(int const a, int const b){
    return a - b;
}

如何轻松消除重复的几个符号类型(字符,短,int,长等)。我试过了SFINAE,但结果并不是很令人鼓舞。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-09-03 21:17:19

您可以将重载、标记分发和模板混合在一起,如下面的示例所示:

代码语言:javascript
复制
#include<type_traits>
#include<utility>
#include<iostream>

template <class T>
int comparator_(char, const T &a, const T &b){
    std::cout << "catch all" << std::endl;
    return (a<b)?-1:((a>b)?1:0);
}

template<typename T>
std::enable_if_t<std::is_same<T,int>::value or std::is_same<T,char>::value, int>
comparator_(int, T const a, T const b){
    std::cout << "char or int" << std::endl;
    return a - b;
}

template<typename... A>
int comparator(A&&... args) {
    return comparator_(0, std::forward<A>(args)...);
}

int main() {
    comparator(42,0);
    comparator('c', 'g');
    comparator(42u, 0u);
}
票数 2
EN

Stack Overflow用户

发布于 2016-09-03 21:04:38

首先,将模板函数委托给模板类。

代码语言:javascript
复制
template <class T>
int comparator(const T &a, const T &b){
    return comparator_impl<T>::comparator(a, b);
}

默认模板类实现是您已经编写的:

代码语言:javascript
复制
template<class T>
class comparator_impl {

public:
    static int comparator(const T &a, const T &b){
        if (a < b){
           return -1;
        }else if (a > b){
           return +1;
        }

    return 0;
};

现在,有一个单独的模板类,它将用于带符号的整数类型:

代码语言:javascript
复制
template<class T>
class signed_int_comparator_impl {

public:
    static int comparator(T a, T b)
    {
          return a-b;
    }
    return 0;
};

现在,专门化第一个模板类,从第二个模板继承专门化:

代码语言:javascript
复制
template<>
class comparator_impl<char> : public signed_int_comparator_impl<char> {};

template<>
class comparator_impl<int> : public signed_int_comparator_impl<int> {};

泡沫,漂洗,重复,为剩余的有符号整数类型。

如果您想将comparator_impl专门化为一个const char *,可以随意这样做。

票数 1
EN

Stack Overflow用户

发布于 2016-09-03 21:07:16

  1. 对于模板专门化,建议使用模板类/结构,而不是模板函数。请参阅http://www.gotw.ca/publications/mill17.htm
  2. std::is_integralstd::is_signed看起来就像你的SFINAE的正确工具。下面是一个有用的示例:https://ideone.com/8wm54h
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39311203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档