c++ - 限制基本模板实例化

标签 c++ templates

我有一个代码如下,如果客户端代码与任何特化不匹配,我想抛出错误。但静态断言并没有帮助解决这个问题。请建议如何实现它。

struct storage_manager{
    storage_impl<double> double_store;
    storage_impl<std::string> string_store;
    template<typename T> 
    bool try_getting(int key, T &value)
    {
        static_assert(false , "Compiler should not reach here");
        return false;
    }
    storage_manager(){}
    ~storage_manager(){}
    storage_manager(storage_manager const &) = delete;
};

double 类型的特化。

template<>
inline bool storage_manager::try_getting<double>(int key, double &value)
{
    return double_store.try_getting(key,value);
}

std::string 类型的特化。

template<>
inline bool storage_manager::try_getting<std::string>(int key, std::string &value)
{
    return string_store.try_getting(key,value);
}

当请求不支持的类型时,如何在编译时抛出错误。就像...

storage_manager  mgr;
int a;
std::cout<<mgr.try_getting(134,a);

最佳答案

你可以做到

template<typename T> 
bool try_getting(int key, T &value) = delete;

并仅实现所需的特化。示例:

#include <iostream>

template<typename> void f() = delete;
template <> void f<int>(){std::cout << "ok\n";}

int main() 
{
    f<int>();
    // f<double>(); // does not compile
}

Live on Coliru

关于c++ - 限制基本模板实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33611526/

相关文章:

c++ - 从文本文件 C++ 中跳过非整数

c++ - 如果模板参数也提供比较运算符,则有条件地提供比较运算符的重载

java - 检查 tpl-if-tag,gxt 模板中的字符是否为中文

c++ - 派生模板覆盖成员函数 C++ 的返回类型

c++ - 为什么编译器不能推断返回类型?

c++ - 模板:使用前向声明来减少编译时间?

java - 以编程方式切换 API 命名约定

c++ - 如何通过定义派生类的构造函数来实例化两个基类的私有(private)数据成员?

c++ - 实现主c++程序与嵌入式ECL的通信

wpf - WPF树状 View 仅在所选项目附近具有按钮