我想創建一個模板類,它將實現一個不同的簽名回調,取決於它是否實例化一種或兩種。使用結構模板專用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;
}
現在我想添加代碼,這樣,如果實例時「OtherClass」,即ParserCallbackSwitch是沒有指定我:
template<typename R, typename I>
struct ParserCallbackSwitch
{
using type = std::function<bool(const std::string &, R&)>;
}
請注意,在這種情況下ParserCallbackSwitch ::類型是一個函數只有兩個參數。
我希望能夠做到以下幾點:
OtherClass<int, float> p; // p::ParserType = std::function<bool(std::string &, int &, float &);
OtherClass<int> q; // q::ParserType = std::function<bool(std::string &, int &);
我無法弄清楚如何對部分案件指定ParserCallbackSwitch
當我是NoIntermediate
型(沒有指定即我是)
解決方案:根據以下回應。這是我最終使用的代碼。
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)? –