यह ++उपयोगकर्ता-परिभाषित इन्फ़िक्स ऑपरेटरों
// User-defined infix operator framework
template <typename LeftOperand, typename Operation>
struct LeftHelper
{
const LeftOperand& leftOperand;
const Operation& operation;
LeftHelper(const LeftOperand& leftOperand,
const Operation& operation)
: leftOperand(leftOperand), operation(operation) {}
};
template <typename LeftOperand, typename Operation >
auto operator < (const LeftOperand& leftOperand,
Operation& operation)
{
return LeftHelper<LeftOperand, Operation>(leftOperand, operation);
}
template <typename LeftOperand, typename Operation, typename RightOperand>
auto operator > (LeftHelper<LeftOperand, Operation> leftHelper,
const RightOperand& rightOperand)
{
return leftHelper.operation(leftHelper.leftOperand, rightOperand);
}
// Defining a new operator
#include <cmath>
static auto pwr = [](const auto& operand1, const auto& operand2) { return std::pow(operand1, operand2); };
// using it
#include <iostream>
int main()
{
std::cout << (2 <pwr> 16) << std::endl;
return 0;
}
दुर्भाग्य से, यह शक्ति ऑपरेटर गलत पूर्वता और संबद्धता है सी में नई इन्फ़िक्स ऑपरेटरों को लागू करना आसान है। तो मेरा सवाल है: इसे कैसे ठीक करें? मैं <pow>
चाहता हूं कि *
से अधिक प्राथमिकता हो और गणितीय नोटेशन की तरह, दाईं ओर संबद्ध हो।
संपादित करें विभिन्न ब्रैकेट्स का उपयोग करके प्राथमिकता को बदलना संभव है, उदा। |op|
, /op/
, *op*
या यहां तक कि यदि कोई ऐसा इच्छुक है, <<--op-->>
, लेकिन कोई भी इस तरह से उच्चतम अंतर्निहित ऑपरेटर प्राथमिकता से अधिक नहीं जा सकता है। लेकिन आज सी ++ टेम्पलेट मेटाप्रोग्रामिंग के साथ इतना शक्तिशाली है और कटौती टाइप करें, वांछित परिणाम प्राप्त करने के लिए बस कुछ और तरीका होना चाहिए।
इसके अतिरिक्त, यह अच्छा होगा अगर मैं pow
का उपयोग कर सकता हूं और pwr
नहीं। दुर्भाग्यवश कुछ कार्यान्वयन में #include <cmath>
वैश्विक नामस्थान में pow
लाता है, इसलिए एक संघर्ष होगा। हम ओवरलोड कर सकते हैं operator not
ऐसी है कि प्रपत्र
not using std::pow;
की घोषणा हटा दिया ग्लोबल नेम स्पेस से std::pow
?
आगे पढ़ने: a related proposal by Bjarne Stroustrup।
"आसान" .......... हे हा। (जैसे, गंभीरता से, मुझे आशा है कि यह केवल अनुसंधान उद्देश्यों के लिए है) –
आप * नए ऑपरेटरों को "आविष्कार" नहीं कर सकते हैं, आप बस ऑपरेटर के समान काम करने वाले कुछ अनुकरण करने के लिए मौजूदा ऑपरेटरों का उपयोग करते हैं लेकिन वास्तविक ऑपरेटर नहीं हैं। यही कारण है कि ऑपरेटर प्राथमिकता काम नहीं कर रही है। और अपने प्रश्न का उत्तर देने के लिए, इसे ठीक करने का कोई तरीका नहीं है। –
यह "रन टू" ऑपरेटर के लिए थोड़ा सा विचार है: 'जबकि (i ----> 0) '। बेहद सुविधाजनक! – user2079303