2017-12-06 6 views
-1

個々の列挙型の値に対してクラスメソッドを特化できますか?次のように は具体的に私は、列挙型とクラスを持っている:列挙値のテンプレートの特殊化

#include <iostream> 
#include <stdio.h> 

using namespace std; 

enum class Animal { dog, cat, bird }; 
class Sound 
{ 
    public: 
     static void getSound (const Animal& arg) 
     { 
     switch (arg) 
     { 
      case Animal::dog: 
      // dog specific processing 
      break; 

      case Animal::cat: 
      // cat specific processing 
      break; 

      case Animal::bird: 
      // bird specific processing 
      break; 

      default: 
      return; 
     } 
     } 
}; 

私は、スイッチケースを取り除くために列挙値のそれぞれに対してgetSound機能を特化したいです。そのようなテンプレートの特殊化は可能ですか?

答えて

1

はい、それは可能です。下のサンプルを見てください。

#include <iostream> 
#include <stdio.h> 

using namespace std; 

enum class Animal { dog, cat, bird }; 
class Sound 
{ 
    public: 
     template<Animal animal> 
     static void getSound(); 
}; 

template<> 
void Sound::getSound<Animal::dog>() 
{ 
    // dog specific processing 
} 

template<> 
void Sound::getSound<Animal::cat>() 
{ 
    // cat specific processing 
} 

template<> 
void Sound::getSound<Animal::bird>() 
{ 
    // bird specific processing 
} 

int main() 
{ 
    Sound::getSound<Animal::dog>(); 
} 
+0

ありがとうございました。あなたの応答のために。これは私の質問を解決します。それを答えとして受け入れます。 – vchandra

2

私は専門化の理由を知りません。この例では、指標となると、あなたのenumneratorsがシーケンシャルと0からスタートしている、あなただけのルックアップテーブルを使用することができた場合:

enum class Animal { dog, cat, bird, count = (bird - dog + 1) }; 

static std::string getSound (Animal arg) // Pass an enumeration by value, it's cheaper 
{ 
    std::array<char const *, static_cast<std::size_t>(Animal::count)> const sound {{ 
    "bark", "meow", "chirp" 
    }}; 
    return sound.at(static_cast<std::size_t>(arg)); 
} 

そして、それはそれです。また、例外がスローされて、"unknown"文字列が置き換えられます。スコープの列挙は、渡される値の厳密なチェックが必要であることを意味するので、これが保証されていると私は思っています。そして、それを破るのはです。例外的な状況はです。


でも編集した質問は、ルックアップテーブルを受けることができます。

static void getSound (Animal arg) // Pass an enumeration by value, it's cheaper 
{ 
    std::array<std::function<void(void)>, 
      static_cast<std::size_t>(Animal::count)> const handler{{ 
    [] { /*Process for dog*/ }, 
    [] { /*Process for cat*/ }, 
    [] { /*Process for bird*/ } 
    }}; 
    handler.at(static_cast<std::size_t>(arg))(); // The last() is invocation 
} 
+0

ご返信ありがとうございます。これはほんの一例です。ケースの内部には一連の処理があります。それが私たちが専門性を利用したい理由です。私はこれを反映するために質問を編集しました。 – vchandra

+0

@vchandra - それでもルックアップテーブルは失格にはなりません。秒でハングアップ – StoryTeller

+0

私の遅い返事を申し訳ありません。さまざまなソリューションを私に提供する時間をとってくれてありがとう。私はこの答えからかなりのことを学びました。私はS.M.による答えを受け入れています。それはテンプレート専門化に関する私の元々の質問に近いものです。再度、感謝します。 – vchandra

関連する問題