我正在尝试使用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
如何利用概念来实现所需的行为?