加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 为什么我们必须为带有默认参数的模板类指定<>?

发布时间:2020-12-16 04:52:45 所属栏目:百科 来源:网络整理
导读:我在C中发现了令人讨厌的东西,我不知道是否有一个技巧可以避免这种情况而没有开销.问题如下: 对于模板功能,我们可以: // Function declaration/definitiontemplatebool Option = false void myFunction() { std::cout"Option = "Optionstd::endl;}// Then
我在C中发现了令人讨厌的东西,我不知道是否有一个技巧可以避免这种情况而没有开销.问题如下:

对于模板功能,我们可以:

// Function declaration/definition
template<bool Option = false> void myFunction() 
{
    std::cout<<"Option = "<<Option<<std::endl;
}

// Then I can use :
myFunction<false>();
myFunction<true>();
myFunction(); // <- NO PROBLEM HERE

现在是模板类:

// Class definition/declaration
template<bool Option = false> class MyClass
{
};

// Then I can use :
myClass<false> x;
myClass<true> y;
myClass z; // <- PROBLEM HERE : only "MyClass<> z;" will compile !

为什么这种行为的原因?
有什么诀窍可以避免吗?
对于具有作为模板传递的optionnal参数的类,我发现这对最终用户来说不方便:他应该能够将默认实现用作非模板化类…

解决方法

Why is the reason of this behaviour ?

这是因为函数可以重载,类型不能.

当您编写函数调用时,编译器会使用该名称填充它可以找到的所有函数的重载集,然后确定哪些函数与传递的参数匹配.现在,为了使用函数模板干净地工作,它允许从参数中推导出模板参数类型.因为通常允许类型参数推断,所以即使参数是默认的,它也适用于您的情况.

但是,类型不会超载.虽然myFunction< true>()和myFunction< false>()都与他们将参与相同重载集的范围相关,但myClass< true>和myClass< false>是分开的和不相关的类型.由于类型名称没有相应的重载,因此没有动机为隐式命名完全专用的模板类添加特殊情况.永远不会推断出这些参数,因此只有在它们全部默认的情况下它才会成为特殊语法.

Is there any trick to avoid that ?

通常,如果要获取模板类的模板参数推导,可以提供模板函数包装器(这最适用于C 11 auto)

template <bool Option=false> class MyClass {};
template <bool Option=false> MyClass<Option> make_my_class() {
    return MyClass<Option>();
}
// ...
auto z = make_my_class();

否则,我认为使用typedef(根据Remy的评论)是最好的选择.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读