모든 구문 오류는 용납되지 않습니다. 나는 이와 비슷한 설정되어 C++ 코드가 있습니다모호한 식별자가있는 void 포인터 캐스트
template<typename T>
void addytox(T *x, T *y, int n)
{
for(int i = 0; i < n; ++i) {
x[i] += y[i];
}
return;
}
void my_func(void *x, void *y, int n, int dtype)
{
/* Here is where I am unsure of how to do a simple static cast using
the dtype identifier. I want to avoid long code using a switch or
if/else that would check all possible conditions, for example having
code that looks like this:
if (dtype == 0) {
addytox((int*)x, (int*)y, n);
}
else if (dtype == 1) {
addytox((float*)x, (float*)y, n);
}
else if (dtype == 2) {
addytox((double*)x, (double*)y, n);
}
else {
//Print/log some error...
exit;
}
return;
*/
}
이유 my_func는 NumPy와 배열을 가리키고 있기 때문에이 같은 설정은 코드를하는 모든 유형 (INT, float32, float64 등)의 수, 그리고 ctypes를 통해 파이썬에서 my_func를 호출합니다. 나는 C++이 NumPy 배열이 어떤 타입인지 알지 못하지만 파이썬에서 데이터 타입을 쉽게 얻을 수 있고 그것을 my_func (이 경우 integer dtype)로 전달할 수있다. 내가 알고 싶은 것은 해당 식별자를 사용할 수 있다면 올바른 형식 캐스팅으로 한 번만 함수 addytox를 호출 할 수 있다는 것입니다. 예를 들어
:
addytox((cast_type*)x, (cast_type*)y, n));
는 C++에서이 같은 일을 할 수 있는가, 그렇다면 어떻게 내가 그 일을 가겠어요?
감사합니다.
짧은 대답은 : 아니오, C++은 이런 식으로 작동하지 않습니다. –
'dtype'의 값은 런타임에 올바른 함수를 호출하기 위해 검사해야하는데, 이것은 컴파일 타임에 정적으로 수행 될 수 없습니다. – lcs