仅允许特定类型的成员函数

时间:2015-04-22 14:08:47

标签: c++ templates partial-specialization

我正在使用C ++和模板 - 但是我需要允许使用特定类型的成员函数并阻止其他类型使用此函数。

例如:我希望此类对所有类型都有print(),但对于foo()类型只有int。我怎么能这样做?

#include<iostream>

template <class type>
class example
{
private:
    type data;

public:
    void print(); // for all types

    void foo();   // only for 'type' == int?
};

3 个答案:

答案 0 :(得分:3)

将常见的通用功能纳入基类。专业化可以继承。

namespace detail {

template <class type>
class example_base
{
private:
type data ;

public:
void print();
};

} // end namespace detail

template <class type>
struct example
    : detail::example_base<type> {
    using detail::example_base<type>::example_base; // inherit any constructors
};

template <> // specialize the class
struct example< int >
    : detail::example_base<int> {
    using detail::example_base<int>::example_base; // inherit any constructors

    void other_function(); // extend the basic functionality
};

答案 1 :(得分:2)

您可以为某些类型指定模板。见这个例子:

let store = EKEventStore()

for source in store.sources() {
    let st: EKSourceType = source.sourceType!
    if st == EKSourceTypeLocal {
        localSource = source;
    }
}

使用GCC 4.7.2进行测试。

答案 2 :(得分:2)

您可以使用std::enable_if并执行此类操作以获得您想要的内容:

#include <iostream>
#include <type_traits>

template<class T>
class example
{
   private:
      T data;
   public:
      void print() 
      { 
         std::cout << " hello " << std::endl;
      }

      template<class U = T // make the function templated on U, but with default type T
             , typename std::enable_if<std::is_integral<U>::value>::type* = nullptr // enable only for when U (T) is an integral type
             >
      void foo()
      {
         std::cout << " I will only compile when T is an integral type " << std::endl;
      }
};


int main()
{
   example<int> integer_example;
   integer_example.print();
   integer_example.foo(); // <--- compiles fine as int is integral

   example<double> double_example;
   double_example.print();
   //double_example.foo(); // <--- will not compile

   return 0;
}

std::enable_if中,您还可以将std::is_same<U,int>::value代替std::is_integral<U>::value,仅允许该函数仅用于int而不是其他整数类型。