我对模板概念很陌生,例如SFINAE
ortag dispatching
并且一直在阅读一些关于它的文章和示例,这些文章和示例对我的方法没有帮助。因此,如果有人可以提供帮助,我将不胜感激。
我的目标是拥有 1 个单一的解析函数,它会在将数据传递给其他一些函数以根据模板T
类型进行特定解析之前做一些事情。
在附加的代码中,这是我想要的一种行为。我在这里使用if constexpr
的是一个 C++17 功能,在我使用的 C++ 版本中不可用。
我认为为此目的,乍一看似乎template specialization
是最好的解决方案,但这不是我想要的。
我认为为此目的tag dispatching
将是一个很好的方向,但我不确定type_traits
当我有自定义类型时如何准确地做到这一点,因为它总是像我有 2 个选项 a true_type
or false_type
,但在下面的代码中我有 3 种情况有更多的潜力。
我真的很感激一些例子或方向,请告诉我做我正在寻找的最佳方法是什么。甚至一些要阅读的文章也会很棒。
提前致谢!
工作代码示例:
#include <string>
#include <vector>
#include <memory>
using namespace std;
struct Base { int id; };
struct Foo : Base { int fooValue; };
struct Bar : Base { int barValue; };
shared_ptr<Foo> parseFoo(const string & data) { return make_shared<Foo>(); }
shared_ptr<Bar> parseBar(const string & data) { return make_shared<Bar>(); }
shared_ptr<vector<Foo>> parseFoos(const string & data) { return make_shared<vector<Foo>>(); }
template <typename T>
shared_ptr<T> parse(const std::string & data)
{
shared_ptr<T> result = nullptr;
if (data.empty())
return result;
result = make_shared<T>();
if constexpr (std::is_same<T, Foo>::value) result = parseFoo(data);
else if constexpr (std::is_same<T, Bar>::value) result = parseBar(data);
else if constexpr (std::is_same<T, vector<Foo>>::value) result = parseFoos(data);
return result;
}
int main()
{
string data = "some json response";
auto foo = parse<Foo>(data);
auto bar = parse<Bar>(data);
auto foos = parse<vector<Foo>>(data);
return 0;
}