3

私はこれに似た状況にあります:

template<class A, class B>
class MyClass<A, B>
{
  ...
  static A RARELY_USED_A;
}

// Seems to work but does not cover all possible cases, since 
// there may be instances of A that have no numeric limits.
template<class A, class B>
A MyClass<A, B>::RARELY_USED_A= std::numeric_limits<A>::max();

私が見たところ、これはうまくいくようです。ただし、状況によっては文字列がAとして使用される場合があるため、この特殊なケースに特化したものを作成するだけだと思いました。

// Does not complile
template<class B>
string MyClass<string, B>::RARELY_USED_A= "";

残念ながら、これはエラーメッセージに適切に準拠していません。

error: template definition of non-template 'std::string MyClass<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, B>::RARELY_USED_A'

一方、完全な特殊化は機能しているように見えることに注意してください(実行時にはテストされていませんが、コンパイルされます)

// This complies but is not gernic enough and hence useless to me
template<>
string MyClass<string, string>::RARELY_USED_A= "";

私は何か間違ったことをしているに違いないと思います。正確に何を指摘していただければ幸いです。私は、特定の専門分野がこのように機能することになっていると思いました。

よろしくお願いします。

e:「デフォルト」はどういうわけか誤解を招くと思ったので、DEFAULT_Aの名前をRARELY_USED_Aに編集しました

4

3 に答える 3

4

継承を使用して、すべての一般的なコードを複製せずに再利用および特殊化します。

template<typename A>
struct RarelyUsedShared
{
    static A RARELY_USED_A;
};

template<typename A>
A RarelyUsedShared<A>::RARELY_USED_A = std::numeric_limits<A>::max();

template<>
string RarelyUsedShared<string>::RARELY_USED_A = "";

template<typename A, typename B>
class MyClass<A, B> : RarelyUsedShared<A>
{
  ...
};

これにより、さまざまな間でメンバーが共有されることに注意してください。Bこれは、メンバーがである必要がある場合は問題ありませんconst。そうでない場合、ヘルパーは2つのテンプレートパラメーターを受け取ることができ、部分的にそれを特殊化することができます。

template<typename A, typename B>
struct RarelyUsedNotShared
{
    static A RARELY_USED_A;
};

template<typename A, typename B>
A RarelyUsedNotShared<A, B>::RARELY_USED_A = std::numeric_limits<A>::max();

template<typename B>
struct RarelyUsedNotShared<string, B>
{
    static A RARELY_USED_A;
};

typename<typename B>
string RarelyUsedNotShared<string, B>::RARELY_USED_A = "";

template<typename A, typename B>
class MyClass<A, B> : RarelyUsedNotShared<A, B>
{
  ...
};
于 2011-07-14T17:05:23.597 に答える
1

単一のメンバーだけでなく、クラス全体に部分的な特殊化を与える必要があります。

于 2011-07-14T16:56:34.393 に答える
0

constの場合RARELY_USEDは、小さなヘルパークラスを使用できます。

template <class A, class B>
const A MyClass<A, B>::RARELY_USED_A = Helper<A>::value;

/*...*/

#include <limits>
#include <string>

template <typename A> struct Helper { static const A RARELY_USED_A; };
template <typename A> const A Helper<A>::RARELY_USED_A = std::numeric_limits<A>::max();

template <> struct Helper<std::string> { static const std::string RARELY_USED_A; };
const std::string Helper<std::string>::RARELY_USED_A = "";
于 2011-07-14T17:08:09.507 に答える