gpt4 book ai didi

c++ - 避免重复变量类型 : Return Type Resolver, C++11 auto,...还有什么?

转载 作者:行者123 更新时间:2023-11-30 04:16:16 28 4
gpt4 key购买 nike

假设我有以下模板函数:

// #include <iostream>

template< typename T >
T read( std::istream& in )
{
T x;
in >> x; // (could check for failure, but not the point)
return x;
}

它旨在像这样使用(从用户输入初始化 const 变量):

// #include <string>
// std::istream& in = std::cin;

const int integer = read< int >( in );
const double decimal = read< double >( in );
const std::string word = read< std::string >( in );
...

但请注意,必须提供相同的类型两次:一次用于变量声明,另一次用于调用。最好避免这样的重复(另见 the DRY principle,“不要重复自己”),因为每个更改都必须重复,例如这样的代码:

const int integer = read< double >( in );
const double decimal = read< int >( in );
const std::string word = read< char* >( in );

编译“很好”,但可能会在运行时做坏事(尤其是第三个,它会导致警告)。

有没有办法避免类型重复?


我已经想到了两种方法,所以我没有假装不知道它们,而是在要求更多之前快速暴露它们:

  1. 返回类型解析器

    我最近发现了the "Return Type Resolver" idiom (来自 this question)。所以我们可以围绕现有函数创建一个带有模板隐式转换运算符的简单类:

    class Read {
    std::istream& m_in;
    public:
    explicit Read( std::istream& in ) : m_in( in ) { }

    template< typename T >
    operator T() const
    {
    return read< T >( m_in );
    }
    };

    现在我们可以这样写代码了:

    const int integer = Read( in );
    const double decimal = Read( in );
    const std::string word = Read( in );
    ...

    其中“返回类型”是自动从变量类型推导出来的(注意:返回类型不是 const 即使变量是,所以这真的等同于原始代码(特别是在可能的内联))。

  2. C++11 自动

    C++11 开始,我们可以使用 the auto specifier作为替代方案,这也避免了两次命名类型,但方法是“逆向”:

    const auto integer = read< int >( in );
    const auto decimal = read< double >( in );
    const auto word = read< std::string >( in );
    ...

    其中变量类型是从返回类型自动推导出来的。

还有什么吗?

现在,您知道其他选择吗? [如果您想知道,请参阅我对下面评论的回复以了解此问题的“原因”。]

谢谢。

最佳答案

好吧,您仍然可以使用预处理器,即使您可能出于风格原因不喜欢它。你可以这样使用它:

#define READ(type, variable, stream) type variable = read<type>(stream)

在此之后,您可以简单地编写作业

READ(int, integer, in);

当然,这将变量的定义及其初始化隐藏在类似函数的结构后面,我不喜欢这样,但这是一个可能的解决方案。

关于c++ - 避免重复变量类型 : Return Type Resolver, C++11 auto,...还有什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17833178/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com