4

重複の可能性:
関数テンプレートの部分的な特殊化

思いついたキーワードで検索すると、さまざまな問題に適した解決策が得られるため、問題の解決策はどこにも見つかりません。私はこれが前に尋ねられなければならないことを理解しています、ただ解決策を見つけることができません。

関数テンプレートがあるとします。

template<class any> print(any value);

私はそれをこのように専門化することができます:例えばint

template<> print<int>(int value)
{
    std::cout << value;
}

しかし、今問題は、ベクトルでも機能するようにしたいです。ベクトルクラスはテンプレートクラスであるため、難しくなります。

このような機能を専門にする:

template<class any> print<vector<any> >(vector<any> value) {}

次のエラーが生成されます(MinGW g ++):

FILE: error: function template partial specialization 'print<vector<any> >' is not allowed

関数printは単なる例であることに注意してください。

どうすればこれを解決できますか?

4

3 に答える 3

5

function-templateがジョブをクラステンプレートメンバー関数に委任するだけの一般的な回避策があります。

#include <vector>
#include <iostream>

template <typename T> struct helper {
    static void print(T value) { std::cout << value; }
};
template <typename T> struct helper<std::vector<T>> {
    static void print(std::vector<T> const &value) { }
};

template <typename T>
void print (T const &value) {
    // Just delegate.
    helper<T>::print (value);
}


int main () {
    print (5);
    std::vector<int> v;
    print (v);
}

ただし、(ecatmurとVaughn Catoによって提案されているように)単純な関数のオーバーロードを使用できる場合は、そうしてください。

于 2012-11-08T14:54:15.833 に答える
2

関数テンプレートを特殊化しようとしないでください。代わりにオーバーロードを使用してください

void print(int value)
{
    std::cout << value;
}

template<class any>
void print(vector<any> value) {}
于 2012-11-08T14:50:11.367 に答える
1

関数テンプレートの部分的な特殊化は、単一定義規則違反につながるため、許可されていません。通常、オーバーロードを使用できます。

template<class any> print(vector<any> value) {}
于 2012-11-08T14:52:02.077 に答える