文法上の誤りはありません。 、あいまいな識別子でのキャストポインタのキャスト
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は、任意の型(int型、のfloat32、float64型など)の可能性numpyの配列を指しているので、このようなコードも設定がある理由:私はこれと同様のセットアップでC++のコードを持っています私はctypes経由でPythonからmy_funcを呼び出しています。私はC++がNumPy配列がどのような型か分からないことを知っていますが、Pythonでデータ型を簡単に取得し、それをmy_func(この場合は整数dtype)に渡すことができます。私が知りたいのは、その識別子を使うことができれば、関数addytoxを適切な型キャストで一度しか呼び出せないことです。例えば
:
addytox((cast_type*)x, (cast_type*)y, n));
それはC++でこのような何かをすることは可能ですし、もしそうなら、どのように私はそれをやって行くのでしょうか?
ありがとうございます。
短い答えは:いいえ、C + +このように動作しません。 –
ある時点で、正しい関数を呼び出すために実行時に 'dtype'の値をチェックする必要があります。これはコンパイル時に静的に行うことはできません。 – lcs