1

私が以下に書いている関数は、関数の処理にかかる時間を計るために作られています。

// return type for func(pointer to func)(parameters for func), container eg.vector
clock_t timeFuction(double(*f)(vector<double>), vector<double> v)
{
    auto start = clock();
    f(v);
    return clock() - start;
}

これは、timeFunctionでテストしたい関数です。

template<typename T>
double standardDeviation(T v)
{
    auto tempMean = mean(v); //declared else where
    double sq_sum = inner_product(v.begin(), v.end(), v.begin(), 0.0);
    double stdev = sqrt(sq_sum / v.size() - tempMean * tempMean);
    return stdev;
}

standardDiviationは、任意のc ++コンテナーを受け入れることができるようにテンプレートを使用して作成されており、timeFunctionでも同じことを実行したいので、次のことを試しました。

template<typename T>
clock_t timeFuction(double(*f)(T), T v)
{
    auto start = clock();
    f(v);
    return clock() - start;
}

しかし、これにより、関数テンプレート「double standardDiviation(T)」を使用できず、「オーバーロードされた関数」のテンプレート引数を推測できないなどのエラーが発生します。

これは私がメインで関数を呼び出した方法です。

int main()
{
    static vector<double> v;
    for( double i=0; i<100000; ++i )
        v.push_back( i );

    cout << standardDeviation(v) << endl; // this works fine
    cout << timeFuction(standardDeviation,v) << endl; //this does not work

}

どのC++コンテナでも機能するようにtimeFunctionを修正するにはどうすればよいですか。どんな助けでも大歓迎です。

4

1 に答える 1

0

このコードをGCC4.7.1でコンパイルしようとしました。コンパイルして正常に動作します。どのコンパイラを使用していますか?テンプレート引数を推測できない場合は、明示的に指定してみてください。つまり、次を使用します。

cout << timeFuction(standardDeviation< vector<double> >,v) << endl;

また、質問をするときは、不要なコードをすべて削除するようにしてください。

#include <iostream>
#include <vector>

using namespace std;

template<typename T>
double standardDeviation(T v)
{
    return 5;
}

template<typename T>
int timeFuction(double(*f)(T), T v)
{
   // auto start = clock();
    f(v);
    return 0;//clock() - start;
}

int main()
{
    static vector<double> v;
    for( double i=0; i<100000; ++i )
        v.push_back( i );

    cout << standardDeviation(v) << endl; // this works fine
    cout << timeFuction(standardDeviation,v) << endl; // this also work

    return 0;
}
于 2013-01-13T00:47:00.553 に答える