我正在使用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?
};
答案 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
而不是其他整数类型。