C ++模板:防止基本模板的实例化

时间:2010-01-12 17:22:34

标签: c++ templates

我有一个界面

std::string
get_string(Source const &s, std::string const &d);
int
get_int(Source const &s, int const &d);
bool
get_bool(Source const &s, bool const &d);

我想改为

template<class T>
T
get(Source const &s, T const &d);

没有合理的基本模板,因此实际的基本定义是合法但无用的(return d;)。如果基础实例化,我该怎么做才能强制编译时失败?对于这种情况,有没有惯用的解决方案?

4 个答案:

答案 0 :(得分:10)

不要定义模板,只需声明它并定义三个特化。

template <typename T>
T get(Source const &, T const &);

template<>
std::string get(Source const &s, std::string const &d) {
    return d + s.stringval(); // or whatever
}

[编辑:删除了有关重载的内容 - 只是一次,模板函数专业化确实似乎更好。谁会砰的一声?]

答案 1 :(得分:3)

只是做

string get(source, string);
int get (source, int);
bool get(source, bool);

答案 2 :(得分:0)

如果您愿意支付运行时多态性,您可以这样做......

template <typename T>
class Interface
{
   virtual T get(Source const &s, T const &d) = 0;
};

class StringInterface : public Interface<std::string>
{
   virtual std::string get(Source const& s, std::string const& d);
};

// etc.

由于您的基类是一个抽象类,如果您尝试直接实例化它将导致编译时失败。

答案 3 :(得分:-1)

将baseclass(t)声明为abstract,这样就永远不会创建该类的实例。