Iai*_*own 1 c++ templates c++17 if-constexpr
如果我有一个具有两个模板参数的类,有没有办法在其中一个参数上分支 if constexpr?在下面的示例中,我可以测试两个参数是否匹配,但我想要一种匹配任何版本的 MyTemplateClass 的方法,该版本将 char 作为其第一个参数。
#include <iostream>
#include <type_traits>
template<typename T,int32_t N>
class MyTemplateClass
{
};
template<typename C>
void DoStuff(const C& myObj)
{
if constexpr(std::is_base_of_v<MyTemplateClass<char,64>, C>) // how do I remove the hardcoded 64?
{
// test passed!
}
else
{
static_assert(false);
}
}
int main()
{
MyTemplateClass<char, 64> passesObj;
MyTemplateClass<char, 128> shouldPassObj;
MyTemplateClass<wchar_t, 64> failsObj;
DoStuff(passesObj); // passes correctly
DoStuff(shouldPassObj); // currently fails, want to make pass
DoStuff(failsObj); // correctly fails
}
Run Code Online (Sandbox Code Playgroud)
你太专注于新的语言特性而不是旧的技术。如果您想要一个仅在给定类型是MyTemplateClass其第一个参数的任何实例时才有效的模板函数,请char编写:
template<int32_t N>
void DoStuff(const MyTemplateClass<char, N> &myObj)
{
// test passed!
}
Run Code Online (Sandbox Code Playgroud)
这是标准的模板参数推导,而不是 C++17if constexpr体操。除了从MyTemplateClass使用char.
使用模板参数包可以有一个更通用的解决方案,但由于包中的所有参数都必须是一种模板参数(类型、值或模板),您将无法混合使用类型和值模板参数在同一个包中:
template<typename ...Args>
void DoStuff(const SomeClass<known, params, ...Args> &myObj);
Run Code Online (Sandbox Code Playgroud)
只有当额外的参数是类型参数,而不是值或模板参数时,这才有效。您可以使用 制作Args一个值参数包auto,但它们不能是类型。C++ 没有生成已知类型模板参数的机制。