gpt4 book ai didi

C++11模板函数接受多个模板别名

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

我想创建一个接受多个模板别名的模板函数。这是一个更有意义的简单示例。

有模板别名TAlias1 和TAlias2

template <typename T>
using TAlias1 = TClass1<T, 2>;

template <typename T>
using TAlias2 = TClass2<T, 3>;

...然后我想创建一个接受上述任何别名的模板函数:

template <typename T, template<typename> class TClass>
TClass<T> someOperation(const TClass<T> &a, const TClass<T> &b)
{
...
}

int main()
{
TAlias1<float> a;
TAlias1<float> b;

TAlias1<float> c = someOperation(a,b);

return 0;
}

但是它会导致 Visual Studio 2013 中的编译错误:

这种情况有什么解决办法吗?

编辑:

这是一个产生错误的完整示例:

template <typename T, int I>
struct TClass1 {};

template <typename T, int I>
struct TClass2 {};

template <typename T>
using TAlias1 = TClass1<T, 2>;

template <typename T>
using TAlias2 = TClass2<T, 3>;

// this should accept TAlias1 and TAlias2
template <typename T, template<typename> class TClass>
TClass<T> someOperation(const TClass<T> &a, const TClass<T> &b) { return {}; }

int main()
{
TAlias1<float> a;
TAlias1<float> b;
TAlias1<float> c = someOperation(a,b);

TAlias2<float> d;
TAlias2<float> e;
TAlias2<float> f = someOperation(d,e);

return 0;
}

错误:

error C2784: 'TClass<T> someOperation(const TClass<T> &,const TClass<T> &)' : could not deduce template argument for 'const TClass<T> &' from 'TClass1<float,2>'

最佳答案

问题出在 someOperation 函数的第二个模板参数中。模板别名不引入新类型,它的工作方式类似于 typedef。这意味着,即使 TAlias1 只接受一个模板参数,它仍然是一个带有 2 个参数的模板(其中设置了第二个参数)。

确实,如果您将函数更改为:

template <typename T, template<typename,int> class TClass>
TClass<T,2> someOperation(const TClass<T,2> &a, const TClass<T,2> &b)
{
return a+b;
}

它会编译(当然,你需要使operator+ const方法)。

更好的方法是不使用模板类作为第二个模板参数,并将函数更改为如下所示:

template <typename T1, typename T2>
auto someOperation(const T1 &a, const T2 &b) -> decltype(a+b)
{
return a+b;
}

或者甚至:

template <typename T>
T someOperation(const T &a, const T &b)
{
return a+b;
}

关于C++11模板函数接受多个模板别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23611398/

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