在讨论typename与类的问题时,遇到了这个博客文章(mariusbancila.ro/blog/2021/03/15/typename-or-class)。这篇文章声称下面的程序起了作用,但我无法证实。这是代码
#include <iostream>
template <typename T>
struct wrapper
{
using value_type = T;
value_type value;
};
template <typename T, typename U>
struct dual_wrapper
{
using value_type1 = T;
using value_type2 = U;
value_type1 value;
value_type2 another_value;
};
template <typename T>
struct foo
{
T wrapped_value;
typename T::value_type get_wrapped_value() { return wrapped_value.value; }
};
int main() {
foo<wrapper<int>> f { {42} }; // works fine
std::cout << f.get_wrapped_value() << '\n';
foo<dual_wrapper<int,double>> f2{ {43, 15.0} }; /// <<<< HOW CAN THIS LINE WORK???
std::cout << f2.get_wrapped_value() << '\n';
}如您所见,struct尝试同时应用包装器和dual_wrapper。dual_wrapper在我的实验中不起作用。我错过了什么或者如何让foo同时使用包装器和dual_wrapper吗?
发布于 2022-09-02 19:26:36
博客文章中的代码与您的不同:
auto get_wrapped_value() { return wrapped_value.value; }你有:
typename T::value_type get_wrapped_value() { return wrapped_value.value; }但是dual_wrapper没有value_type成员别名。
通过使用auto返回类型,可以从wrapped_value.value ( foo<wrapper>的wrapper::value_type和foo<dual_wrapper>的dual_wrapper::value_type1 )推导出该类型。
在第二次阅读时,我意识到blogpost以您的行开头,但是在下一节中介绍了foo和auto返回类型(“作为括号,这个特殊问题还有另一种解决方案来自这个示例(给出的是函数的返回类型只需要包装的值类型),即返回类型使用auto )。”
https://stackoverflow.com/questions/73586954
复制相似问题