嵌套模板参数时,我已经知道的类型名
Nested Template arguments when I know the typenames already
在这种情况下,我有一个Algorithm
类:
template <typename SourceType, typename DestType>
class Algorithm {
bool apply() { ... return true;}
};
我试图创建一个Helper
,从完全定义的Algorithm
类抽象用户。这是我对实现的想法:
template <typename DataType, template <typename, typename> class AlgorithmType>
bool Helper(const DataType* soure, DataType* dest) {
AlgorithmType<DataType, DataType> alg;
return alg.apply();
}
Helper
功能是否正确?有更好的方法吗?
这似乎是正确的。但是你的apply
不返回任何东西,这是UB。
至于改进,您可以反转模板参数的顺序,并让DataType
被推导出来:
template <template <typename, typename> class AlgorithmType, typename DataType>
bool Helper(const DataType* soure, DataType* dest) {
AlgorithmType<DataType, DataType> alg;
return alg.apply();
}
现在你可以用
Helper<Algorithm>(const_ptr, ptr);
你可以阻止第二个参数的演绎,使其更健壮:
template<typename T> struct identity{ using type = T; };
template<typename T>
using block_deduction = typename identity<T>::type;
template <template <typename, typename> class AlgorithmType, typename DataType>
bool Helper(const DataType* soure, block_deduction<DataType*> dest) {
AlgorithmType<DataType, DataType> alg;
return alg.apply();
}
现在你可以用
来调用它Helper<Algorithm>(const_ptr, const_ptr);
Helper
函数是正确的,但是您可能希望将typename DataType
作为最后一个模板参数,以便可以从函数调用中推导出它:
template <template <typename, typename> class AlgorithmType, typename DataType>
bool Helper(const DataType* soure, DataType* dest) {
AlgorithmType<DataType, DataType> alg;
return alg.apply();
}
现在你可以这样使用Helper
:
int main()
{
const int* some_src_ptr = /*...*/;
int* some_dst_ptr = /*...*/;
Helper<SomeAlgorithmTemplate>(some_src_ptr, some_dst_ptr);
}
或者,您可以将整个算法作为模板参数传递,并让用户自行选择SourceType
和DestType
:
template <typename SourceType, typename DestType>
class Algorithm {
public:
using source_type = SourceType;
using dest_type = DestType;
private:
bool apply() {}
};
template <typename Algo>
bool Helper(const typename Algo::source_type* soure, typename Algo::dest_type* dest) {
Algo alg;
return alg.apply();
}
现在你可以这样使用Helper
:
int main()
{
const int* some_src_ptr = /*...*/;
int* some_dst_ptr = /*...*/;
Helper<SomeAlgorithmTemplate<int, int>>(some_src_ptr, some_dst_ptr);
}
您也可以考虑使算法独立于编译时参数,并使用例如:
struct Algorithm {
template <class Source, class Dest>
bool operator()(Source source, Dest dest) {
//...
return something;
}
};
然后:
template <class AlgType, typename DataType>
bool Helper(const DataType* soure, DataType* dest) {
AlgType alg;
return alg(source, dest);
}
运行:Helper<Algorithm>(source_ptr, dest_ptr);
相关文章:
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 如何解决一元"*"(有"字符")错误的无效类型参数?
- "std::shared_ptr":不是参数"_Ty"的有效模板类型参数
- 具有可变参数非类型参数的模板专用化
- 函数类型参数的模板参数推导
- PowerShell 使用结构类型参数调用 C++ DLL 的导出函数
- 对于非常量指针类型的参数,未调用具有常量指针模板类型参数的功能
- 为模板传递非类型参数 agument
- 为什么带有类型参数的运算符 () 可以应用于 result_of 上下文中的类型?
- 使用其他模板类型参数作为要在函数签名中使用的类型别名声明
- 如何避免具有相同类型参数的函数中的错误
- 将内置类型变量传递给只有一个类类型参数的"+"运算符函数时自动类型转换的构造函数
- c++非类型参数包扩展
- 如何实现对参数顺序不可知的std::same_as的广义形式(即对于两个以上的类型参数)
- 在不同的模板参数包之间分发非类型参数包
- 如何在使用容器和字符串时强制使用显式分配器类型参数
- 错误:一元"*"的类型参数无效(具有"int"):使用 mergesort 计算
- EXPECT_CALL具有 unique_ptr 引用类型参数的模拟函数
- 作为模板类型参数,为什么 type[N] 与其专用版本不匹配----模板<类 T>类 S<T[]>
- C++ 模板:重载时找不到基类类型参数方法