2

我正在尝试实现一个通用配置文件解析器,我想知道如何在我的类中编写一个能够根据输入参数的类型确定其返回类型的方法。这就是我的意思:

class Config
{
    ...
    template <typename T>
    T GetData (const std::string &key, const T &defaultValue) const;
    ...
}

为了调用上述方法,我必须使用这样的东西:

some_type data = Config::GetData<some_type>("some_key", defaultValue);

如何摆脱冗余规范?我看到 boost::property_tree::ptree::get() 能够做到这一点,但实现相当复杂,我无法破译这个复杂的声明:

template<class Type, class Translator>
typename boost::enable_if<detail::is_translator<Translator>, Type>::type
get(const path_type &path, Translator tr) const;

如果可能的话,我想这样做,而不是在将使用我的 Config 类的代码中创建对 boost 的依赖。

PS:说到 C++ 模板,我是一个 n00b :(

4

1 回答 1

5

enable_if您显示的代码中的 做一些不相关的事情。在您的情况下,您可以删除显式模板规范,编译器将从参数中推断出它:

some_type data = Config::GetData("some_key", defaultValue);

更好的是,在 C++11 中你甚至不需要在声明时指定变量类型,它也可以被推断出来:

auto data = Config::GetData("some_key", defaultValue);

…但请注意,C++ 只能从参数推断模板参数,而不是返回类型。也就是说,以下内容不起作用

class Config {
    …
    template <typename T>
    static T GetData(const std::string &key) const;
    …
}
some_type data = Config::GetData("some_key");

在这里,您要么需要使模板参数显式化,要么使用返回代理类而不是实际对象的技巧,并定义隐式转换运算符。杂乱无章,大多数时候是不必要的。

于 2012-06-18T09:46:26.843 回答