gpt4 book ai didi

c++ - 变参函数,如何让它类型安全更有意义?

转载 作者:可可西里 更新时间:2023-11-01 18:38:11 24 4
gpt4 key购买 nike

我是C++新手,第一语言是中文,所以我用英文的话可能没什么意思,先说声抱歉。我知道有一种方法可以编写一个带有可变参数的函数,每次调用时参数的数量或类型可能不同,我们可以使用 va_list、va_start 和 va_end 的宏。但是众所周知,是C风格。当我们使用宏时,我们将失去类型安全和自动推理的好处,然后我尝试用 C++ 模板来做。我的工作如下:


#include<iostream>
#include<vector>
#include<boost/any.hpp>

struct Argument
{
typedef boost::bad_any_cast bad_cast;

template<typename Type>
Argument& operator,(const Type& v)
{
boost::any a(v);
_args.push_back(a);
return *this;
}

size_t size() const
{
return _args.size();
}

template<typename Type>
Type value(size_t n) const
{
return boost::any_cast<Type>(_args[n]);
}

template<typename Type>
const Type* piont(size_t n) const
{
return boost::any_cast<Type>(&_args[n]);
}
private:
std::vector<boost::any> _args;
};

int sum(const Argument& arg)
{
int sum=0;
for(size_t s=0; s<arg.size(); ++s)
{
sum += arg.value<int>(s);
}

return sum;
}

int main()
{
std::cout << sum((Argument(), 1, 3, 4, 5)) << std::endl;

return 0;
}

我觉得很丑,我想有办法做得更好吗?谢谢,对于语言错误,我们深表歉意。

最佳答案

你可以这样做:

template <typename T>
class sum{
T value;
public:
sum ()
: value() {};
// Add one argument
sum<T>& operator<<(T const& x)
{ value += x; return *this; }
// to get funal value
operator T()
{ return value;}
// need another type that's handled differently? Sure!
sum<T>& operator<<(double const& x)
{ value += 100*int(x); return *this; }
};

#include <iostream>

int main()
{
std::cout << (sum<int>() << 5 << 1 << 1.5 << 19) << "\n";
return 0;
}

这种技术(运算符重载和类似流的函数类)可以解决可变参数的不同问题,而不仅仅是这个。例如:

create_window() << window::caption - "Hey" << window::width - 5;
// height of the window and its other parameters are not set here and use default values

关于c++ - 变参函数,如何让它类型安全更有意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1350657/

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