限制基本模板实例化

时间:2015-11-09 14:37:27

标签: 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;
};

双重类型的专业化。

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);

1 个答案:

答案 0 :(得分:4)

你可以做到

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