c++ - 根据函数参数数目调用不同的函数
伊谢尔伦
伊谢尔伦 2017-04-17 15:00:27
0
3
629

我现在需要对矩阵进行操作,这些操作的过程都是类似的,只是其中的一个算子不同。这些算子有些是对每个元素操作,有些是对相邻之间的进行操作,我尝试用以下的方法去把算子和步骤分离开来,但是问题是对于参数个数不同的情况怎么处理?能不能编译时就确定好该调用的函数?

#include <vector>
using namespace std;

template <typename OPER, typename T>
void executor(OPER op, vector<vector<T>>& m)
{
    //--- pre processing
    //...
    //---
    T last = T();
    for (auto& v : m){
        for (auto& a : v){
            // if(varnum == 1)
            op(a);            
            //if(varnum == 2)
            //op(a, last);    // fail
            last = a;
        }
    }
    //--- post processing
    //...
    //---
}


void f1(float& a)        
{
    a *= 2;
}
void f2(float& a, float b)    // fail 需要两个参数
{
    a -= b;
}

int main()
{
    vector<vector<float>> m;
    
    executor(f1, m);
    //executor(f2, m);    // fail

    return 0;
}
伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全員に返信(3)
Peter_Zhu

私はたまたま同様の行列ライブラリ https://github.com/codehz/mat...
私も同様の問題に遭遇しましたが、私のニーズは前者と後者ではありませんが、単純なパラメータの違い
私が採用した解決策は、コールバック関数のパラメータリストを通じて自動的にそれを決定することです - 次のように簡略化されています

リーリー

function_traits のコードは、コンパイル中に関数関連の情報を取得するために使用されます。
if constexpr は、constexpr を削除した後にコンパイルが失敗する場合に必要となる場合があります。 std::enable_if を使用して解決してください。

いいねを押す +0
巴扎黑

複数のパラメータを構造体に入れて、構造体ポインタをパラメータとして使用することは可能ですか?

いいねを押す +0
黄舟

コードから判断すると、多くの解決策があります。
f2 の b は簡単に取得できるので、executor(std::bind(f2, _1, 2), m);
または

を使用できます。 リーリー

他の値の場合は、std::enable_if を使用してエグゼキューターのオーバーロードを記述することができます。原則として SFINAE 原則を使用します。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート