【问题标题】:Can I define templates for different sets of types?我可以为不同的类型集定义模板吗?
【发布时间】:2018-07-25 08:28:20
【问题描述】:

我需要编写一个模板化函数,它的行为取决于其参数的类:

template<class ContainerType>
bool myFunc(ContainerType in){
//do some stuff
}

template<class NotAContainerType>
bool myFunc(NotAContainerType in){
//do something else
}

我仅限于 C++11,所以 static_if 不在讨论范围内。此外,ContainerTypeNotAContainerType 的类非常大,将来可能会发生变化,因此仅仅手动添加一些例外作为模板特化也是不明智的。

我知道std::enable_if 解决方法,但是如果我需要将它应用到两个相互不同的类集,我该如何使用它?

【问题讨论】:

  • 您如何区分这些类型的课程?如果没有该代码,我们将无法为您提供太多帮助。
  • std::enable_if正是您要寻找的 - 所以只需定义如何区分“容器”类型与其他类型。
  • @Jaa-c,我将它们区分开来,正如它们的名字所暗示的那样: ContainerType 用于 std::containers (例如,它们有一个 iterator ),而 NotAConatinerType 用于其他任何东西

标签: c++ c++11 templates template-specialization enable-if


【解决方案1】:

Create a traits for your concept Container,那么,你可以使用 SFINAE

template <typename T>
typename std::enable_if<is_container<T>::value, bool>::type
myFunc(T in){
    //do some stuff
}

template <typename T>
typename std::enable_if<!is_container<T>::value, bool>::type
myFunc(T in){
    //do some stuff
}

或标签调度

namespace details
{

    template <typename T>
    bool myFunc(T in, std::true_type){
        //do some stuff
    }

    template <typename T>
    bool myFunc(T in, std::false_type){
        //do some stuff
    }

}


template <typename T>
bool myFunc(T in){
    return details::myFunc(in, is_container<T>{});
}

【讨论】:

  • 标签调度为胜利;好多了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-25
  • 2019-07-11
  • 1970-01-01
  • 2012-01-30
  • 1970-01-01
  • 2019-06-09
相关资源
最近更新 更多