gpt4 book ai didi

c++ - 如何将算术运算符传递给模板?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:05:51 27 4
gpt4 key购买 nike

我想以某种方式将这些模板合并为一个:

template <class Result, class T1, class T2>
class StupidAdd
{
public:
T1 _a; T2 _b;
StupidAdd(T1 a, T2 b):_a(a),_b(b) {}
Result operator()() { return _a+_b; }
};

template <class Result, class T1, class T2>
class StupidSub
{
public:
T1 _a; T2 _b;
StupidSub(T1 a, T2 b):_a(a),_b(b) {}
Result operator()() { return _a-_b; }
};

(后跟 Mul、Div 等相同的代码)所有代码都相同,除了实际的“+”、“-”(和“StupidAdd”、“StupidSub”等)。

这些愚蠢的“仿函数”然后被另一个模板使用。如果没有预处理器,我怎样才能避免重复?(我进入模板的原因是为了避免预处理器)

也就是说,如何将算术运算符传递到模板中?

最佳答案

也许你可以使用 std::plus<T> , std::minus<T> , std::multiplies<T> std::divides<T> .但是,只有当两个操作数的类型相同时,或者如果左边的操作数可以转换为第一个操作数的类型,这些方法才会起作用。

除了使用预处理器之外,我看不出有什么方法可以实现您想要做的事情。不需要宏的任何充分理由?

如果你想确保返回类型足够大以包含结果,你可以这样做:

#include <functional>
#include <boost/mpl/if_.hpp>

// Metafunction returning the largest type between T and U
// Might already exist in Boost but I can't find it right now...maybe
// boost::math::tools::promote_args
template <typename T, typename U>
struct largest :
boost::mpl::if_<
boost::mpl::bool_<(sizeof(T) > sizeof(U))>,
T,
U
>
{};

template <typename T, typename U, template <typename S> class Op>
struct Foo
{
typedef typename largest<T, U>::type largeType;

largeType bar(const T & t, const U & u)
{
return Op<largeType>()(t, u); // Applies operator+
}
};

int main()
{
Foo<int, double, std::plus> f;
double d = f.bar(12, 13.0); // takes int and double, returns double
}

在这里,我使用了Boost MPLlargest元函数,但您可以编写自己的 if元函数,如果你不能使用 Boost(由两种类型和一个 bool 参数化的类模板,专门用于 true 和 false)。

要确定表达式的返回类型,您还可以查看 boost::result_of如果我理解正确的话,这相当于即将到来的 decltype C++0x 中的运算符。

关于c++ - 如何将算术运算符传递给模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1625557/

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