限制基本模板实例化

Restricting base template instantiation

本文关键字:实例化      更新时间:2023-10-16

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

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

CCD_ 1型的专门化。

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 << "okn";}
int main() 
{
    f<int>();
    // f<double>(); // does not compile
}

在Coliru上直播