如何在C ++中使用模板函数

时间:2015-02-14 03:34:52

标签: c++ templates

我目前正在做一个使用模板计算标量产品(点积)的程序,而且我遇到了两件事的问题。

一个是:如何声明模板并从main调用它。 两个是:如何将数组传递给函数。

感谢任何帮助,谢谢

// scalarProduct.cpp : Defines the entry point for the console application.
//
#include <iostream>
#include <math.h>       /* sqrt */

using namespace std;

template<typename T> 
void scalarProduct(T a[], T b[])
{
    T a[3];
    T b[3];

    this->a[] = a;
    this->b[] = b;

    T axb;
    T roota;
    T rootb;
    T result;

    axb = ((a[0] * b[0]) + (a[1] * b[1]) + (a[2] * b[2]));
    roota = sqrt((a[0] * a[0]) + (a[1] * a[1]) + (a[2] * a[2]));    // the formula for the Euclidean length of the vector A.
    rootb = sqrt((b[0] * b[0]) + (b[1] * b[1]) + (b[2] * b[2]));    // the formula for the Euclidean length of the vector B.
    result = axb / roota * rootb;

    cout << "Result: " << result;
};

int main()
{
    int a[3];
    int b[3];

    cout << "Enter A: " << endl;        // Vector A Input
    cout << "X:";
    cin >> a[0];
    cout << "Y:";
    cin >> a[1];
    cout << "Z:";
    cin >> a[2];

    cout << "Ennter B: " << endl;       // Vector B Input
    cout << "X:";
    cin >> b[0];
    cout << "Y:";
    cin >> b[1];
    cout << "Z:";
    cin >> b[2];

    scalarProduct(a[], b[]);


    system("pause");
    return 0;

}

3 个答案:

答案 0 :(得分:2)

对于问题的模板部分:

下面是声明和定义模板函数的格式:

template<compileTimeParameters>
returnType functionName(functionParameters) {
    ...;
}

并像这样调用它:

functionName<compileTimeParameters>(functionParameters);

例如,如果你想要一个用cout打印的功能,你可以这样做:

template<typename T>
void println(T value) {
    std::cout << value << std::endl;
}

并像这样调用:

int main() {
    //string
    println<std::string>("yo yo yo print a newline");

    //integer
    println<int>(420);

    //some other random type
    println<myType>(someInstanceOfMyType);

}

如果编译器可以通过函数参数推导出模板参数,则不必在<>括号内明确指定任何内容。例如:

int main() {
    //compiler deduces that you are passing a const char[]
    println("the compiler can figure out what I mean");
}

答案 1 :(得分:2)

在scalarProduct()中删除你的本地数组a和b - 你从传递给函数的参数中获取它们。另外,scalarProduct是一个函数,而不是类的方法,因此没有“this”可供引用。

在main()中只需调用:

scalarProduct(a, b);

它应该工作。

答案 2 :(得分:1)

您的问题不是模板,而是C ++基础知识,例如将数组传递给函数。

// scalarProduct.cpp : Defines the entry point for the console application.
//
#include <iostream>
#include <math.h>       /* sqrt */

using namespace std;

template<typename T> 
void scalarProduct(T a[], T b[])
{
    /* 
    * remove this
    T a[3];
    T b[3];

    this->a[] = a;
    this->b[] = b;
    */

    T axb;
    T roota;
    T rootb;
    T result;

    axb = ((a[0] * b[0]) + (a[1] * b[1]) + (a[2] * b[2]));
    roota = sqrt((a[0] * a[0]) + (a[1] * a[1]) + (a[2] * a[2]));    // the formula for the Euclidean length of the vector A.
    rootb = sqrt((b[0] * b[0]) + (b[1] * b[1]) + (b[2] * b[2]));    // the formula for the Euclidean length of the vector B.
    result = axb / roota * rootb;

    cout << "Result: " << result;
};

int main()
{
    int a[3];
    int b[3];

    cout << "Enter A: " << endl;        // Vector A Input
    cout << "X:";
    cin >> a[0];
    cout << "Y:";
    cin >> a[1];
    cout << "Z:";
    cin >> a[2];

    cout << "Ennter B: " << endl;       // Vector B Input
    cout << "X:";
    cin >> b[0];
    cout << "Y:";
    cin >> b[1];
    cout << "Z:";
    cin >> b[2];

    //scalarProduct(a[], b[]);
    scalarProduct(a, b);

    system("pause");
    return 0;

}

另外,如果你处理三维点,我认为创建struct Pointclass Point是个好主意。如果你希望你的函数处理向量,那么使用指针或更好 std::vector