我可以用C ++编写一个取幂运算符吗?

时间:2017-06-24 00:46:58

标签: c++ operators

在数值编程中,我经常想要将数字提升到表达式中的幂。这会导致代码出现数百次pow(x,2)或类似的事情。

这会使代码变得混乱并使其更难以解析,尤其是在将编写的方程与代码进行比较时。

我想在C ++中编写一个求幂运算符,如果可能的话。

a^b == pow(a, b)

我已尝试为operator()(double, double)operator[](double, double)编写重载(选择因为它比(二进制)*更紧密。但是我无法使其工作。

这样的事情有可能吗?

也许是预处理器欺骗?

2 个答案:

答案 0 :(得分:2)

这样的东西?

#include <iostream>
#include <cmath>

using namespace std;

class Exp {
 public:
  double val ;
  Exp(double val) : val(val) {}
  Exp operator^(const Exp &exp) {
      return Exp(pow(val, exp.val));
  }
  operator double () {
    return val;
  }
};

ostream &operator << (ostream &out, const Exp &exp) {
  out << exp.val;
  return out;
}


int main(){
   Exp a = 2;
   Exp b = 3;

   cout << (a + b) << ", " << (a ^ b) << endl;

   return 0;
 }

答案 1 :(得分:0)

您可以定义自己的用户定义文字,该文字返回带有调用操作符的对象以执行取幂,如

{return a.offsetWidth <= 0 && a.offsetHeight <= 0 || !k.reliableHiddenOffsets() && "none" === (a.style && a.style.display || m.css(a, "display"))
}, m.expr.filters.visible = function(a) {
    return !m.expr.filters.hidden(a)
};
var Qc = /%20/g,
    Rc = /\[\]$/,
    Sc = /\r?\n/g,
    Tc = /^(?:submit|button|image|reset|file)$/i,
    Uc = /^(?:input|select|textarea|keygen)/i;

function Vc(a, b, c, d) {
    var e;
    if (m.isArray(b)) m.each(b, function(b, e) {
        c || Rc.test(a) ? d(a, e) : Vc(a + "[" + ("object" == typeof e ? b : "") + "]", e, c, d)
    });
    else if (c || "object" !== m.type(b)) d(a, b);
    else
        for (e in b) Vc(a + "[" + e + "]", b[e], c, d)
}
m.param = function(a, b) {
    var c, d = [],
        e = function(a, b) {
            b = m.isFunction(b) ? b() : null == b ? "" : b, d[d.length] = encodeURIComponent(a) + "=" + encodeURIComponent(b)
        };
    if (void 0 === b && (b = m.ajaxSettings && m.ajaxSettings.traditional), m.isArray(a) || a.jquery && !m.isPlainObject(a)) m.each(a, function() {
        e(this.name, this.value)
    });
    else
        for (c in a) Vc(c, a[c], b, e);
    return d.join("&").replace(Qc, "+")
}, m.fn.extend({
    serialize: function() {
        return m.param(this.serializeArray())
    },
    serializeArray: function() {
        return this.map(function() {
            var a = m.prop(this, "elements");
            return a ? m.makeArray(a) : this
        }).filter(function() {
            var a = this.type;
            return this.name && !m(this).is(":disabled") && Uc.test(this.nodeName) && !Tc.test(a) && (this.checked || !W.test(a))
        }).map(function(a, b) {
            var c = m(this).val();
            return null == c ? null : m.isArray(c) ? m.map(c, function(a) {
                return {
                    name: b.name,
                    value: a.replace(Sc, "\r\n")
                }
            }) : {
                name: b.name,
                value: c.replace(Sc, "\r\n")
            }
        }).get()
    }
}), m.ajaxSettings.xhr = void 0 !== a.ActiveXObject ? function() {
    return !this.isLocal && /^(get|post|head|put|delete|options)$/i.test(this.type) && Zc() || $c()
} : Zc;
var Wc = 0,
    Xc = {},
    Yc = m.ajaxSettings.xhr();
a.attachEvent && a.attachEvent("onunload", function() {
    for (var a in Xc) Xc[a](void 0, !0)
}), k.cors = !!Yc && "withCredentials" in Yc, Yc = k.ajax = !!Yc, Yc && m.ajaxTransport(function(a) {
    if (!a.crossDomain || k.cors) {
        var b;
        return {
            send: function(c, d) {
                var e, f = a.xhr(),
                    g = ++Wc;
                if (f.open(a.type, a.url, a.async, a.username, a.password), a.xhrFields)
                    for (e in a.xhrFields) f[e] = a.xhrFields[e];
                a.mimeType && f.overrideMimeType && f.overrideMimeType(a.mimeType), a.crossDomain || c["X-Requested-With"] || (c["X-Requested-With"] = "XMLHttpRequest");
                for (e in c) void 0 !== c[e] && f.setRequestHeader(e, c[e] + "");
                f.send(a.hasContent && a.data || null), b = function(c, e) {
                    var h, i, j;
                    if (b && (e || 4 === f.readyState))
                        if (delete Xc[g], b = void 0, f.onreadystatechange = m.noop, e) 4 !== f.readyState && f.abort();
                        else {
                            j = {}, h = f.status, "string" == typeof f.responseText && (j.text = f.responseText);
                            try {
                                i = f.statusText
                            } catch (k) {
                                i = ""
                            }
                            h || !a.isLocal || a.crossDomain ? 1223 === h && (h = 204) : h = j.text ? 200 : 404
                        }
                    j && d(h, i, j, f.getAllResponseHeaders())
                }, a.async ? 4 === f.readyState ? setTimeout(b) : f.onreadystatechange = Xc[g] = b : b()
            },
            abort: function() {
                b && b(void 0, !0)
            }
        }
    }
});

function Zc() {
    try {
        return new a.XMLHttpRequest
    } catch (b) {}
}

function $c() {
    try {
        return new a.ActiveXObject("Microsoft.XMLHTTP")
    } catch (b) {}
}
m.ajaxSetup({
    accepts: {
        script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
    },
    contents: {
        script: /(?:java|ecma)script/
    },
    converters: {
        "text script": function(a) {
            return m.globalEval(a), a
        }
    }
}), m.ajaxPrefilter("script", function(a) {
    void 0 === a.cache && (a.cache = !1), a.crossDomain && (a.type = "GET", a.global = !1)
}), m.ajaxTransport("script", function(a) {
    if (a.crossDomain) {
        var b, c = y.head || m("head")[0] || y.documentElement;
        return {
            send: function(d, e) {
                b = y.createElement("script"), b.async = !0, a.scriptCharset && (b.charset = a.scriptCharset), b.src = a.url, b.onload = b.onreadystatechange = function(a, c) {
                    (c || !b.readyState || /loaded|complete/.test(b.readyState)) && (b.onload = b.onreadystatechange = null, b.parentNode && b.parentNode.removeChild(b), b = null, c || e(200, "success"))
                }, c.insertBefore(b, c.firstChild)
            },
            abort: function() {
                b && b.onload(void 0, !0)
            }
        }
    }
});
var _c = [],
    ad = /(=)\?(?=&|$)|\?\?/;
m.ajaxSetup({
    jsonp: "callback",
    jsonpCallback: function() {
        var a = _c.pop() || m.expando + "_" + vc++;
        return this[a] = !0, a
    }
}), m.ajaxPrefilter("json jsonp", function(b, c, d) {
    var e, f, g, h = b.jsonp !== !1 && (ad.test(b.url) ? "url" : "string" == typeof b.data && !(b.contentType || "").indexOf("application/x-www-form-urlencoded") && ad.test(b.data) && "data");
    return h || "jsonp" === b.dataTypes[0] ? (e = b.jsonpCallback = m.isFunction(b.jsonpCallback) ? b.jsonpCallback() : b.jsonpCallback, h ? b[h] = b[h].replace(ad, "$1" + e) : b.jsonp !== !1 && (b.url += (wc.test(b.url) ? "&" : "?") + b.jsonp + "=" + e), b.converters["script json"] = function() {
        return g || m.error(e + " was not called"), g[0]
    }, b.dataTypes[0] = "json", f = a[e], a[e] = function() {
        g = arguments
    }, d.always(function() {
        a[e] = f, b[e] && (b.jsonpCallback = c.jsonpCallback, _c.push(e)), g && m.isFunction(f) && f(g[0]), g = f = void 0
    }), "script") : void 0
}), m.parseHTML = function(a, b, c) {
    if (!a || "string" != typeof a) return null;
    "boolean" == typeof b && (c = b, b = !1), b = b || y;
    var d = u.exec(a),
        e = !c && [];
    return d ? [b.createElement(d[1])] : (d = m.buildFragment([a], b, e), e && e.length && m(e).remove(), m.merge([], d.childNodes))
};
var bd = m.fn.load;
m.fn.load = function(a, b, c) {
    if ("string" != typeof a && bd) return bd.apply(this, arguments);
    var d, e, f, g = this,
        h = a.indexOf(" ");
    return h >= 0 && (d = m.trim(a.slice(h, a.length)), a = a.slice(0, h)), m.isFunction(b) ? (c = b, b = void 0) : b && "object" == typeof b && (f = "POST"), g.length > 0 && m.ajax({
        url: a,
        type: f,
        dataType: "html",
        data: b
    }).done(function(a) {
        e = arguments, g.html(d ? m("<div>").append(m.parseHTML(a)).find(d) : a)
    }).complete(c && function(a, b) {
        g.each(c, e || [a.responseText, b, a])
    }), this
}, m.each(["ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend"], function(a, b) {
    m.fn[b] = function(a) {
        return this.on(b, a)
    }
}), m.expr.filters.animated = function(a) {
    return m.grep(m.timers, function(b) {
        return a === b.elem
    }).length
};
var cd = a.document.documentElement;

function dd(a) {
    return m.isWindow(a) ? a : 9 === a.nodeType ? a.defaultView || a.parentWindow : !1
}
m.offset = {
    setOffset: function(a, b, c) {
        var d, e, f, g, h, i, j, k = m.css(a, "position"),
            l = m(a),
            n = {};
        "static" === k && (a.style.position = "relative"), h = l.offset(), f = m.css(a, "top"), i = m.css(a, "left"), j = ("absolute" === k || "fixed" === k) && m.inArray("auto", [f, i]) > -1, j ? (d = l.position(), g = d.top, e = d.left) : (g = parseFloat(f) || 0, e = parseFloat(i) || 0), m.isFunction(b) && (b = b.call(a, c, h)), null != b.top && (n.top = b.top - h.top + g), null != b.left && (n.left = b.left - h.left + e), "using" in b ? b.using.call(a, n) : l.css(n)
    }
}, m.fn.extend({
    offset: function(a) {
        if (arguments.length) return void 0 === a ? this : this.each(function(b) {
            m.offset.setOffset(this, a, b)
        });
        var b, c, d = {
                top: 0,
                left: 0
            },
            e = this[0],
            f = e && e.ownerDocument;
        if (f) return b = f.documentElement, m.contains(b, e) ? (typeof e.getBoundingClientRect !== K && (d = e.getBoundingClientRect()), c = dd(f), {
            top: d.top + (c.pageYOffset || b.scrollTop) - (b.clientTop || 0),
            left: d.left + (c.pageXOffset || b.scrollLeft) - (b.clientLeft || 0)
        }) : d
    },
    position: function() {
        if (this[0]) {
            var a, b, c = {
                    top: 0,
                    left: 0
                },
                d = this[0];
            return "fixed" === m.css(d, "position") ? b = d.getBoundingClientRect() : (a = this.offsetParent(), b = this.offset(), m.nodeName(a[0], "html") || (c = a.offset()), c.top += m.css(a[0], "borderTopWidth", !0), c.left += m.css(a[0], "borderLeftWidth", !0)), {
                top: b.top - c.top - m.css(d, "marginTop", !0),
                left: b.left - c.left - m.css(d, "marginLeft", !0)
            }
        }
    },
    offsetParent: function() {
        return this.map(function() {
            var a = this.offsetParent || cd;
            while (a && !m.nodeName(a, "html") && "static" === m.css(a, "position")) a = a.offsetParent;
            return a || cd
        })
    }
}), m.each({
    scrollLeft: "pageXOffset",
    scrollTop: "pageYOffset"
}, function(a, b) {
    var c = /Y/.test(b);
    m.fn[a] = function(d) {
        return V(this, function(a, d, e) {
            var f = dd(a);
            return void 0 === e ? f ? b in f ? f[b] : f.document.documentElement[d] : a[d] : void(f ? f.scrollTo(c ? m(f).scrollLeft() : e, c ? e : m(f).scrollTop()) : a[d] = e)
        }, a, d, arguments.length, null)
    }
}), m.each(["top", "left"], function(a, b) {
    m.cssHooks[b] = Lb(k.pixelPosition, function(a, c) {
        return c ? (c = Jb(a, b), Hb.test(c) ? m(a).position()[b] + "px" : c) : void 0
    })
}), m.each({
    Height: "height",
    Width: "width"
}, function(a, b) {
    m.each({
        padding: "inner" + a,
        content: b,
        "": "outer" + a
    }, function(c, d) {
        m.fn[d] = function(d, e) {
            var f = arguments.length && (c || "boolean" != typeof d),
                g = c || (d === !0 || e === !0 ? "margin" : "border");
            return V(this, function(b, c, d) {
                var e;
                return m.isWindow(b) ? b.document.documentElement["client" + a] : 9 === b.nodeType ? (e = b.documentElement, Math.max(b.body["scroll" + a], e["scroll" + a], b.body["offset" + a], e["offset" + a], e["client" + a])) : void 0 === d ? m.css(b, c, g) : m.style(b, c, d, g)
            }, b, f ? d : void 0, f, null)
        }
    })
}), m.fn.size = function() {
    return this.length
}, m.fn.andSelf = m.fn.addBack, "function" == typeof define && define.amd && define("jquery", [], function() {
    return m
});
var ed = a.jQuery,
    fd = a.$;
return m.noConflict = function(b) {
return a.$ === m && (a.$ = fd), b && a.jQuery === m && (a.jQuery = ed), m
}, typeof b === K && (a.jQuery = a.$ = m), m
});

这种方法的明显缺点是它只适用于文字值,即没有5.123_E(3) (虽然a_E(b)可行)。

5.123_E(b)