gpt4 book ai didi

c++ - 通过枚举模板参数编译时间类模板选择

转载 作者:行者123 更新时间:2023-11-30 02:24:34 25 4
gpt4 key购买 nike

我正在尝试根据给定的枚举模板参数 (store_type) 选择一个类模板。现在我实例化一个使用它的类,但它似乎总是试图为这个类实例化 basic_store。

enum store_type
{
none,
basic,
lockless,
};

template<class T, store_type S = none, typename = void>
struct get_store_type
{
};

template<class T>
struct get_store_type<T, basic,
typename std::enable_if<!std::is_abstract<T>::value>::type>
{
using store_type = typename basic_store<T>;
};

template<class T>
struct get_store_type<T, lockless>
{
using store_type = typename lockless_store<T>;
};

template<typename T, store_type S>
class client
{
public:
using my_store_type = typename get_store_type<T, S>::store_type;
}

//Tries to instantiate a basic store... which is not allowed.
client<SomeAbstractType, lockless> something;

最佳答案

您忘记了特化中的第三个 模板参数。

template<class T> struct get_store_type<T, lockless, void >
^^^^

以下代码的输出是123:

#include <iostream>

enum store_type { none, basic, lockless };

template<class T, store_type S = none, typename = void>
struct get_store_type
{ int a = 1; };

template<class T>
struct get_store_type<T, basic, typename std::enable_if<!std::is_abstract<T>::value>::type>
{ int b = 2; };

template<class T>
struct get_store_type<T, lockless, void >
{ int c = 3; };

struct Any{};

int main( void )
{
get_store_type<int> storeA;
get_store_type<Any, basic> storeB;
get_store_type<int, lockless> storeC;

std::cout << storeA.a << std::endl;
std::cout << storeB.b << std::endl;
std::cout << storeC.c << std::endl;

return 0;
}

关于c++ - 通过枚举模板参数编译时间类模板选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45252290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com