テンプレートクラスを作成しようとしています.1つまたは複数のタイプでインスタンス化されているかどうかによって、異なる署名付きのコールバックを実装します。enable_ifを使用した構造化テンプレートの特殊化
struct NoIntermediate
{
};
template<typename R, typename I>
struct ParserCallbackSwitch
{
using type = std::function<bool(const std::string &, R&, I&)>;
}
template<typename R, typename I = NoIntermediate>
class OtherClass
{
public:
typedef ParserCallbackSwitch<R, I>::type ParserType;
}
は、今私は、コードを追加したいので、ParserCallbackSwitchがあろうと、「OtherClass」インスタンス化するとき、私は指定されていない場合:この場合にはParserCallbackSwitch ::型が関数であることを
template<typename R, typename I>
struct ParserCallbackSwitch
{
using type = std::function<bool(const std::string &, R&)>;
}
お知らせ2つのパラメータしかありません。
私は、次の操作を実行できるようにしたかった:
OtherClass<int, float> p; // p::ParserType = std::function<bool(std::string &, int &, float &);
OtherClass<int> q; // q::ParserType = std::function<bool(std::string &, int &);
私はタイプNoIntermediate
である場合に、部分的にケースのためParserCallbackSwitch
を指定する方法を見つけ出すことはできません(つまり、私が指定されていない)
解決策:以下の回答に基づきます。ここで私は最終的に使い終わったコードです。
struct NoIntermediate {};
template<typename R, typename I = NoIntermediate>
struct ParserCallbackSwitch
{
using type = std::function<bool(const std::string &, R&, I&)>;
};
template<typename R>
struct ParserCallbackSwitch<R, NoIntermediate>
{
using type = std::function<bool(const std::string &, R&)>;
};
template<typename R, typename I = NoIntermediate>
class OtherClass
{
public:
typedef ParserCallbackSwitch<R, I>::type ParserType;
}
[パラメータパック](http://en.cppreference.com/w/cpp/language/parameter_pack)が必要なのでしょうか? –