std::tuple_size and references

3
我的问题是好奇而且很简短:为什么没有针对引用的std::tuple_size特化,这是否有充分的理由?
(接下来是动机)
我有很多代码看起来像:
template<typename Tuple, typename Indices = 
    std::make_index_sequence<
        std::tuple_size<
            typename std::remove_reference<Tuple>::type>::value
        >
    >
auto func(Tuple&& t, ...) -> decltype(...) {
    return ...;
}

我希望使用remove_reference不是错误的做法,但由于它只在类型级别上起作用,所以我在这里看不到问题。另一个可能性是通过std::move传递元组,因为这样Tuple就不是引用了,但是由于我只想转发元组,所以我也想传递左值引用,所以我使用了std::remove_reference。
这并不是很糟糕,我只是好奇为什么tuple_size不能处理引用类型。有任何想法吗?
1个回答

1
一般来说,类型特征操作的是实际传递的类型,而不是任何潜在相关的类型。提供std::tuple_size>的基本操作似乎是一致的,可以用于创建更方便的版本。反过来,即从方便的版本构建更严格的版本似乎更有问题。
只需使用帮助程序:
template <typename T>
struct my_tuple_size
   : std_integral_constant<std::size_t,
        std::tuple_size<
            typename std::remove_reference<T>::type>
             ::value> {
};

(我希望我在手机上输入得正确)


你能写成一个部分特化吗?template <typename T> struct my_tuple_size : tuple_size<T> {}; template <typename T> struct my_tuple_size<T&> : tuple_size<T> {} - rodrigo
@rodrigo:当然可以。我也考虑过使用constexpr函数。我不知道哪个版本对编译器来说更容易。 - Dietmar Kühl
不仅是缩短代码的有效解决方案,而且还建议将其视为设计决策(与“然后XYZ会崩溃”形成对比;就在昨天,我读到了关于std::optional中关系运算符的可怕讨论;))-谢谢! - Richard Vock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接