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

如何自定义模板不包括某些类型[重复]

海灵均
2023-03-14

以下是特定于模板类类型的函数,如何自定义模板代码,使其不针对某些类型进行编译?如果问题不清楚,请看这个例子。

///** template class ***/
template<typename T>
class testClass{
testClass();
T parameter;
}
template<typename T>
void testClass<T>::print(){cout<<parameter.value<<endl;}

上述类应适用于以下类型:

 //** types file **/
    class paramtype1{
    int value;
    }
    class paramtype2{
    int value;
    }
    class paramtype3{
    }

如您所见,paramtype3没有,因此我得到一个编译错误,表示未定义值。我知道,如果我想专门化某个类型的模板类函数,我需要执行以下操作:

template<>
void testClass<paramtype1>::print(){cout<<parameter.value<<endl;}

但是,有没有办法反过来做,只排除某些类型?


共有2个答案

尉迟清野
2023-03-14

我个人会排除使用某些类型的权限:

template <class T, class... Ts>
struct is_any : std::disjunction<std::is_same<T, Ts>...> {};

// https://stackoverflow.com/questions/17032310/how-to-make-a-variadic-is-same

template <typename T>
void do_something() {
    static_assert(!is_any<T, int, bool>::value, "do_something<T> cannot be used with T as int or bool");
    // code here
}

允许您添加自定义断言消息aswel,从而很容易意识到哪里出了问题。

公孙俊弼
2023-03-14

如果要启用/禁用完整类/结构,可以使用SFINAE和部分专门化。

下面是一个C17示例

template <typename T, typename = void>
struct testClass;

template <typename T>
struct testClass<T, std::void_t<decltype(T::value)>>
 {
   testClass()
    { };

   T parameter;

   void print()
    { std::cout << parameter.value << std::endl; }
 };

如果您只想启用/禁用print()函数,您必须将其模板化;通过示例

template <typename U = T>
std::void_t<decltype(U::value)> print()
 { std::cout << parameter.value << std::endl; }

或者也

template <typename U = T>
std::void_t<decltype(U::value), std::enable_if_t<std::is_same_v<U, T>>> 
    print()
 { std::cout << parameter.value << std::endl; }

如果你想确保没有人能“劫持”解释模板类型调用的方法

testClass<paramtype3>{}.print<paramtype1>():
 类似资料:
  • 我试图为自定义帖子类型创建一个页面,但我无法真正实现。以下是我正在尝试的全部内容- 自定义帖子类型注册的functions.php片段 我使用名为单Tutorial.php的模板为这个自定义帖子类型模板。此外,在我的帖子显示中,我使用the_permalink()链接到帖子。 现在考虑一个标题为Test3的帖子现在在我的仪表板上,我看到它的PyMalink AS。 当我回显我得到的_permali

  • 我正在做一个游戏,玩家在1-36之间选择6个数字 我要做的是创建一个新数组,该数组不包括6个选定的数字,并且新数组的长度为30。 这就是我所做的 生成的第一个数组: 这是我试图获得新数组的代码,但还不完美,因为从所选的6个数字中至少有1或2个数字仍然是新数组的一部分。 我做错了什么?

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

  • 有人能帮我解决这个该死的pagenavi问题吗?我一直在尝试在stackoverflow和其他论坛上找到的所有可能的解决方案,但当我想访问pagenavi的第二页时,仍然会遇到404错误。 我尽可能地精简了代码。这应该管用,对吧? 更多信息:我正在使用一个自定义页面模板,网站上不同的自定义帖子类型,还有一个博客,其中包括panenavi(确实有效)。我也尝试重置永久链接每次我改变代码,也没有帮助。

  • 从MinDoc v0.13及以上版本开始支持自定义模板(仅Markdown编辑器)。 创建自定义模板 用户可在编辑项目时将编辑器内的内容报错为模板: 点击保存按钮右侧的公文包按钮会弹出保存为模板的界面: 填写模板名称点击立即保存即可。 全局模板是指,在其他项目中可用,目前仅支持管理员保存全局模板,非管理员及时选中了全局,保存时也是仅项目内可用。 使用自定义模板 点击编辑器上的模板按钮可以显示选择模