2

関数テンプレートがあります:

//the most generalized template 
template<typename typeArg, typename typeRet>
typeRet func(const typeArg &val);

およびそのためのいくつかの特殊化は、次のようになります。

template<>
someType func(const otherType &val)
{
    //code
}

template<>
typeFoo func(const typeBar &val)
{
    //more code
}

ただし、デフォルトの実装はありません。

明らかに、両方のタイプを自動的に推測することはできないため、呼び出しは次のようになります。

type1 var1 = func<argType,type1>(arg);

型が同一の場合にのみ、デフォルトの実装を記述する適切な方法は何ですか?

私はいくつかの変種を試しました:

1 回目の試行

template<typename theOnlyType, theOnlyType>
theOnlyType func(const typeArg &theOnlyType)
{
    //code
}

しかし、この関数にはテンプレート パラメーターが 1 つしかなく、上記の呼び出しに対応していないため、これは誤りです。

2回目の試行

template<typename type1, typename type2>
type1 func(const type1 &theOnlyType)
{
    //code
}

呼び出しがあいまいになり、候補はこの関数と、コードの最初のブロックからの最も一般化されたテンプレートです。

4

1 に答える 1

3

少し勉強した後、私はかなり良い解決策を思いつきました。これには、静的メソッドの周りにラッパー クラスを追加し、グローバル メソッドを介してそれらをディスパッチする必要があります。

#include <iostream>

namespace tag
{
    template <typename U, typename P>
    struct wrapper // default implementation
    {
        static U foo(P const &)
        {
            std::cout << "different types";
            return U();
        }
    };
}

namespace tag
{
    template <typename T>
    struct wrapper<T, T> // specialized
    {
        static T foo(T const &)
        {
            std::cout << "same type";
            return T();
        }
    };
}

template <typename U, typename P>
static inline U foo(P const &p)
{
    return tag::wrapper<U, P>::foo(p);
}

int main()
{
    foo<int>(0);
    foo<int>(true);
}

これが役立つことを願っています。


使用std::enable_if( std::is_sameC++11):

template <typename A, typename B, typename = 
          typename std::enable_if<std::is_same<A, B>::value>::type> 
B foo(const A &) {

}

または、C++03 以前ではこのバージョンを使用します。

template <typename A, typename B> struct foo; // implement for different types

template <typename T> struct foo<T, T> {
    T operator()(const T &) {
        // default impelentation
    }
};

int main() {

    foo<int, int> f;
    int n;

    f( n );

}

これを改善する方法があると確信しています。関数で部分的な特殊化を使用しようとしましたが、うまく機能しませんでした。

于 2012-12-27T17:29:54.187 に答える