gpt4 book ai didi

c++ - 如何使用概念专门化类型特征?

转载 作者:行者123 更新时间:2023-12-05 01:23:58 29 4
gpt4 key购买 nike

我正在尝试使用 C++ 概念来编写一个类型特征,该特征将根据其模板参数是否为基本类型产生不同的类型:

template<typename T>
concept fundamental = std::is_fundamental_v<T>;

template<typename T>
concept non_fundamental = !std::is_fundamental_v<T>;

以下代码按预期工作:

void Print(fundamental auto value)
{
std::cout << "fundamental\n";
}
void Print(non_fundamental auto value)
{
std::cout << "non fundamental\n";
}

int main()
{
Print(1); // prints "fundamental"
Print(std::string("str")); // prints "non fundamental"
}

在类型特征上应用相同的想法是行不通的。

template<fundamental T>
struct SomeTypeTrait
{
using type = T;
};

template<non_fundamental T>
struct SomeTypeTrait
{
using type = std::shared_ptr<T>;
};


using ExpectedToBeDouble = SomeTypeTrait<double>::type;
using ExpectedToBeSharedPtrOfString = SomeTypeTrait<std::string>::type; // fails to compile

我收到一个编译器错误 (MSVC) 说:

error C3855: 'SomeTypeTrait': template parameter 'T' is incompatible with the declaration

如何使用概念实现所需的行为?

最佳答案

显然语法与我的想法略有不同。

这是一个可行的解决方案:

template<typename T>
struct SomeTypeTrait {};

template<fundamental T>
struct SomeTypeTrait<T> // note the extra <T>
{
using type = T;
};

template<non_fundamental T>
struct SomeTypeTrait<T> // note the extra <T>
{
using type = std::shared_ptr<T>;
};

此外,其中一个特化可以成为默认实现,使代码更短一些,并允许以后添加更多特化:

template<typename T>
struct SomeTypeTrait // default
{
using type = std::shared_ptr<T>;
};

template<fundamental T>
struct SomeTypeTrait<T> // specialization for fundamental types
{
using type = T;
};

关于c++ - 如何使用概念专门化类型特征?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71788243/

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