当前位置: 首页 > 知识库问答 >
问题:

限制模板函数只允许某些类型

姬存
2023-03-14
template <class Type>
std::ostream& operator<< (std::ostream& stream, const Type subject) {
stream << "whatever, derived from subject\n";
return stream; }

我想问,有没有可能限制我的模板函数,使它只接受我指定的几种类型?这就是如何告诉编译器在我使用cout<

更明确地说,这就是我要做的:

template <class Type>
std::ostream& operator<< (std::ostream& stream, const Type subject) {
if (Type == TypeA or TypeB or TypeC) //use this template and do these {...};
else //ignore this template, and use operator<< provided in standard c++ library.
}

共有1个答案

贺英悟
2023-03-14

您可以像这样限制重载:

template <class T>
std::ostream& my_private_ostream( std::ostream& stream, const T& data )
    { <your implementation> }

template <class T, class A>
std::ostream& operator<< ( std::ostream& stream, const std::vector<T,A>& data )
    { return my_private_ostream(stream,data); }

std::arrays也是如此(您应该用C++11标记您的问题):

template <class T, size_t N>
std::ostream& operator<< ( std::ostream& stream, const std::array<T,N>& data )
    { return my_private_ostream(stream,data); }

或者,对于看起来更像编辑的解决方案,您可以使用C++11enable_if,尽管我个人不喜欢它们,因为它们会使代码难以阅读和维护。所以我强烈推荐前面的解决方案。

// Vector type predicate
template <class T>
struct is_vector: std::false_type {};

template <class T, class A>
struct is_vector< std::vector<T,A> >: std::true_type {};

// Array type predicate
template <class T>
struct is_array: std::false_type {};

template <class T, size_t N>
struct is_array< std::array<T,N> >: std::true_type {};

// The overload with the syntax you want
template <class Indexable>
typename std::enable_if<
    is_vector<Indexable>::value || is_array<Indexable>::value,
    std::ostream& 
>::type
operator<< ( std::ostream& stream, const Indexable& data )
    { <your implementation> }
 类似资料:
  • 问题内容: 我正在创建一个页面,供用户上传文件。如果文件类型是其他jpg,gif和pdf,我希望使用if语句创建$ error变量。 这是我的代码: 我在构造if语句时遇到困难。我怎么说呢 问题答案: 将允许的类型放入数组并使用。

  • 我正在spring boot中创建一个REST api,目前我有一个映射来获取用户和特定用户的列表。 假设我的用户是这样的: 还有,在发送更新用户的请求时,请求体是否需要正确嵌套? 两者都是有效的还是2号?

  • 我有一个Vector类,它有一个的模板,例如。我可以为二维空间中的向量执行,为四维空间执行等等。如果,我想在类中添加一些方法,例如为执行getters为一个足够维的向量执行。如果与维度不正确的向量一起使用,我希望得到一个编译错误。 我到处看了很多,其中一个我认为比较接近的东西是,但是,我不知道如何在我的特定情况下使用它(条件是或)。 这是正确的方式,还是有一个完全不同的方式我应该做这件事? 顺便说

  • 我正在用PHP做一个简单的网站,我正在使用DropzoneJS上传文件 我尝试只允许以下扩展: pdf、png、jpg、jpeg、bmp和txt . 有什么帮助吗?抱歉英语不好 这是我的upload.php代码 干杯,先生。

  • 不幸的是,一个第三方服务IFRAME我仍然需要在我的页面是不加载了。有一种方法允许第三方域,即使嵌入策略打开? 谢了。达里奥。

  • 我创建了一个Treeview(javafx),它看起来像: 我现在想要的是,只有“tour”-树项是可选择的。但我不知道怎么做。 我已经用ChangeListener尝试过了,但我只能用它刷新选项卡(TabPane)的内容...刷新很好...但是可以选择“delivery”-TreeItems:(