연산자를 매개변수로 전달
2를 평가하는 기능을 갖고 싶습니다.bool
(진리표 같은) vars.
예를 들어,
부터
T | F : T
그리고나서
myfunc('t', 'f', ||); /*defined as: bool myfunc(char lv, char rv, ????)*/
할까return true;
.
세 번째 파라미터는 어떻게 전달할 수 있습니까?
(Char*로 전달할 수 있다는 것을 알고 있지만 연산자 문자열을 비교하기 위해 다른 테이블을 가지고 작업을 수행해야 합니다.)
다음과 같은 연산자를 통과시킬 수 있습니까?^
(XOR) 또는||
(OR) 또는&&
(AND), 기타 기능/방법?
선언:
template<class Func> bool myfunc(char lv, char rv, Func func);
또는 별도로 연결해야 하는 경우:
bool myfunc(char lv, char rv, std::function<bool(bool,bool)> func);
그러면 다음 전화를 걸 수 있습니다.
myfunc('t', 'f', std::logical_or<bool>());
@ybungalobill은 C++ 정답을 올렸으니 당신은 그것을 고수해야 합니다.연산자를 전달하려면 함수는 작동하지 않지만 매크로는 작동합니다.
#define MYFUNC(lv, rv, op) ....
// Call it like this
MYFUNC('t', 'f', ||);
조심하세요, 매크로는 악이니까요.
특정 유형을 반환하는 프록시 연산자를 정의할 수 있습니다.
namespace detail {
class or {
bool operator()(bool a, bool b) {
return a || b;
}
};
class and {
bool operator()(bool a, bool b) {
return a && b;
}
};
// etc
class X {
or operator||(X x) const { return or(); }
and operator&&(X x) const { return and(); }
};
};
const detail::X boolean;
template<typename T> bool myfunc(bool a, bool b, T t) {
return t(a, b);
}
// and/or
bool myfunc(bool a, bool b, std::function<bool (bool, bool)> func) {
return func(a, b);
}
// example
bool result = myfunc(a, b, boolean || boolean);
복잡한 논리식을 전달하기 위해 템플릿을 사용하여 이 효과를 필사적으로 연결할 수 있습니다.
또한 XOR 연산자는 논리적이지 않고 비트 와이즈 방식입니다. 비록 그 차이는 현실적으로 아무것도 아닙니다.
하지만 C++0x에 람다가 존재하는 이유가 있고, 이런 플랫 아웃은 C++03을 빨아들이기 때문입니다.
현대 C++는 람다를 사용하여 모든 연산자를 통과시킬 수 있습니다.
업데이트 1: 제안된 솔루션은 @HolyBlackCat에서 제안하는 약간의 개선 사항을 소개합니다.
#include <iostream>
template<class T, class F> void reveal_or(T a, T b, F f)
{
// using as function(a, b) instead of expression a || b is the same thing
if ( f(a, b) )
std::cout << a << " is || " << b << std::endl;
else
std::cout << a << " is not || " << b << std::endl;
}
template<class T> void reveal_or(T a, T b)
{
// reuse the already defined ||
reveal_or(a, b, [](T t1, T t2) {return t1 || t2; });
}
|| 연산자가 정의된 경우 매개 변수를 전달하는 방법에 신경 쓰지 마십시오.
int main ()
{
reveal_or('1', 'a');
return 0;
}
매개 변수로 명시적으로 전달합니다.우리는 이국적인 말도 안 되는 것을 포함해서 무엇이든 통과시킬 수 있습니다.
int main ()
{
//same as above:
reveal_or('1', 'a', [](char t1, char t2) { return t1 || t2; });
//opposite of above
reveal_or('1', 'a', [](char t1, char t2) { return !( t1 || t2; ) });
return 0;
}
실현이 어렵습니다.C++에서 함수 매개변수는 객체를 찾기 위해 멤로이 주소가 필요하지만 연산자는 컴파일 시간에 결정됩니다.연산자는 개체가 아닙니다.그래서 매크로를 생각해서 작업을 끝낼 수 있습니다.
언급URL : https://stackoverflow.com/questions/4530588/passing-operator-as-a-parameter
'programing' 카테고리의 다른 글
메모리 내 데이터베이스 디스크에 저장 (0) | 2023.10.04 |
---|---|
C 다차원 배열의 포인터 주소 (0) | 2023.10.04 |
스키마를 잃었습니다.rb!재생할 수 있습니까? (0) | 2023.10.04 |
MySql - InnoDB를 MyISAM Storage Engine of Database로 변환 (0) | 2023.10.04 |
Pycharm and sys.argv 인수 (0) | 2023.10.04 |