使用默认参数转发参考?

用户名

我在尝试弄清楚如何为转发引用(默认为Scott Meyers称为通用引用指定默认参数时遇到麻烦

这是尝试执行我想做的代码的示例:

struct encoder_t {

} const encoder = {};

struct validator_t {

} const validator = {};

struct test {

    template <typename Range, typename Encoding, typename Validation>
    test ( Range&& range, Encoding&& encoding = encoder, Validation&& validation = validator ) {

    }

};

int main() {

    test( "woof" );

}

也可在Coliru上使用

仔细检查错误,可以发现可以通过默认使用模板参数,然后默认构造该参数来使其正常工作:

// Works! But the syntax is strange... potential ramifications/deduction mishaps?
// Is this the "proper" way to default these arguments?
template <typename Range, typename Encoding = encoder_t, typename Validation = validator_t>
test ( Range&& range, Encoding&& encoding = Encoding(), Validation&& validation = Validation() ) {

}

同样在Coliru上

这是处理此问题的“正确”方法吗?我应该使用什么语法?有多种方法可以达到“默认转发参考”的预期效果吗?我应该用哪种方式写这个?还请记住,稍后我将在代码上撒上大量的SFINAE,因此我更喜欢不包含编写多个重载的内容。

毫米

首先,不能从默认参数推断出模板类型因此,我们只能寻找其他方法来实现能够有选择地指定参数以匹配转发引用的想法。

此替代方法表明自己:

template <typename Range, typename Encoding = encoder_t, typename Validation = validator_t>
test ( Range&& range, Encoding&& encoding = encoder, Validation&& validation = validator )
{
}

但是,此操作将失败:转发引用通过将模板类型推导为引用类型而起作用,但是您已指定了对象类型。现在,右值引用不能绑定到虚拟对象的左值。

如您在帖子中所说,可以通过将默认值设置为临时对象encoder_t{}而不是虚拟对象来解决此问题该问题确认在这种情况下引用确实保留为转发引用。

另一个解决方法是使用单独的构造函数而不是默认参数:

template <typename Range>
test ( Range&& range )
{
}

template <typename Range, typename Encoding>
test ( Range&& range, Encoding&& encoding )
{
}

template <typename Range, typename Encoding, typename Validation>
test ( Range&& range, Encoding&& encoding, Validation&& validation )
{
}

根据您在构造函数主体中所做的确切操作,可以使用构造函数委托来实现此目的。

既然您提到了添加SFINAE的意图,也许这篇文章会有一些想法:在构造函数中使用通用引用时如何允许默认构造

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用默认参数转发参考?

来自分类Dev

返回转发参考参数-最佳做法

来自分类Dev

程序是否不使用无法绑定到参考参数的默认参数合法?

来自分类Dev

C ++何时在转发参考上使用const参考

来自分类Dev

使用参考参数

来自分类Dev

缩写功能模板与带有转发参考参数的功能模板

来自分类Dev

转发参考的参数类型检查不起作用

来自分类Dev

C ++了解默认参数中的参考

来自分类Dev

const参考参数的默认值

来自分类Dev

如何使用C ++转发参考正确指定noexcept?

来自分类Dev

返回转发的参考

来自分类Dev

使代码“转发可参考”

来自分类Dev

折叠转发参考

来自分类Dev

跨模块转发参考

来自分类Dev

返回类型的转发参考

来自分类Dev

返回转发的参考

来自分类Dev

使用参考更改默认色线xyplot

来自分类Dev

如何使用参数转发注释高阶函数

来自分类Dev

常量转发参考vs常量参考作为转发参考

来自分类Dev

CloudFormation-参考资源作为参数的默认值

来自分类Dev

可选功能参数,默认值为参考值

来自分类Dev

默认值AWS替换为伪参数参考

来自分类Dev

使用参考参数传递指向函数的指针

来自分类Dev

参数与参考

来自分类Dev

转发参考和模板模板

来自分类Dev

使用argparse读取默认参数

来自分类Dev

使用`self`作为默认参数

来自分类Dev

使用默认参数的C ++重载

来自分类Dev

使用其他参数的默认参数