我写的代码如下:
#include <type_traits>
template <typename T>
class myTemplateClass
{
public:
myTemplateClass(T t)
: val{t}
{}
T val;
};
template <template<typename> class TT, typename T>
auto create(T val)
requires std::is_same_v<TT<T>, myTemplateClass<T>>
{
return TT<T>(val);
};
int main()
{
auto result = create<myTemplateClass<int>>(10);
// or
auto result = create(static_cast<int>(10));
}
但是两个create
函数调用都没有构建成功。
第一个呼叫错误(在MSVC上):
错误C2672: '创建':没有找到匹配的重载函数
错误C3207: '创建':无效的模板参数'TT',类>模板将
第二个呼叫错误(在MSVC上):
错误C2672: 'create':没有找到匹配的重载函数
错误C2783: 'auto create(T)':无法推断'TT'的模板参数
我希望编译以下代码:
auto result = create(static_cast<int>(10));
create
依赖于2个模板参数:TT
和T
。
因此,您想要做的一种方法是显式地提及它们:
//-------------------vvvvvvvvvvvvvvv--vvv-----
auto result = create<myTemplateClass, int>(10);
上面的评论(@ songyuananyao)提到了另一种方法(推导int
的方法):
auto result = create<myTemplateClass>(10);
With
template <template<typename> class TT, typename T>
auto create(T val)
requires std::is_same_v<TT<T>, myTemplateClass<T>>;
调用它的方法是
create<myTemplateClass>(42);
create<myTemplateClass, int>(42);
,
auto result = create<myTemplateClass<int>>(10);
你需要:
template <typename TT, typename T>
auto create(T val)
requires std::is_same_v<TT, myTemplateClass<T>>
{
return {val};
}
,
auto result = create(10); // myTemplateClass<int>
你需要:
template <typename T>
auto create(T val) -> myTemplateClass<T>
{
return {val};
}
注意
注意create
(std使用make_xx
作为std::make_optional
/std::make_pair
/…)在CTAD (c++ 17)中并不真正需要,您可以这样写:
auto result = myTemplateClass(10); // myTemplateClass<int>