gpt4 book ai didi

c++ - 将模板参数区分为嵌套模板

转载 作者:太空狗 更新时间:2023-10-29 20:24:57 27 4
gpt4 key购买 nike

我有getId()模板函数,可以像getId< SomeType >()一样使用和 getId< Some< NestedType >>() .我必须以某种方式区分它们。

template<typename TRequest>
ParameterId getId() // #1
{
return tEParameterId_None;
}

template<template <class> class TRequest, class TType>
ParameterId getId() // #2
{
return TType::paramId;
}

template<TRequest<TType>>
ParameterId getId() // #3, not working
{
return TType::paramId;
}

ParameterId none = getId<SomeType>(); // #1 will be called
ParameterId still_none = getId<Some<NestedType>>(); // #1 will be called, but I want #3
ParameterId some_other = getId<SomeType, NestedType>(); // #2 will be called

我的问题是,如何指定#3 getId() 模板函数,即getId< Some < NestedType > >()调用精确的 3d 变体?或者我可以使用哪种编译时模板魔术来区分嵌套模板?

因为在整个代码符号中,如 Some< NestedType >被使用了,我不想改变它并像getId< SomeType, NestedType >()那样调用- 这将是不一致的。

最佳答案

您可以使用自定义类型特征来检测类型是否为模板:

template <class> 
struct is_template : std::false_type {};

template <template <class...> class T, typename ...Args>
struct is_template<T<Args...>> : std::true_type {};

并使用 std::enable_if选择正确的重载(如果类型是模板则启用重载,否则启用另一个):

template<class T>
typename std::enable_if<is_template<T>::value, int>::type getId() // #1
{
std::cout << "#1";
return 42;
}

template<class T>
typename std::enable_if<!is_template<T>::value, int>::type getId() // #2
{
std::cout << "#2";
return 42;
}

用法:

int main()
{
getId<int>(); // Calls #2
getId<std::vector<int>>(); // Calls #1
}

Live Demo

关于c++ - 将模板参数区分为嵌套模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25611933/

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