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

标签 c++ templates c++11

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

有模板别名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/

相关文章:

c++ - 错误 C2440 : 'initializing' : cannot convert from 'const temp1' to 'temp2'

使用 setw 和 setfill 的 C++ 输出格式化

c++ - 在 C++ 中使用参数包进行函数式编程

C 宏数据库 - 在另一个宏中测试宏函数的参数

c++ - 从字符串文字到 char * 的转换

c++ - 无法将 openssl 库链接到 CLion C++ 程序

c++ - 是否有生产者消费者以外的设计模式来描述这种模式?

c++ - 在轨道上随机放置对象

c++ - 从嵌套的 STL 模板推断类型

c++ - 逗号运算符、return 语句和 nullptr 没有副作用吗?