Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 测试一个模板参数时的Constexpr_C++_Templates_C++17_If Constexpr - Fatal编程技术网

C++ 测试一个模板参数时的Constexpr

C++ 测试一个模板参数时的Constexpr,c++,templates,c++17,if-constexpr,C++,Templates,C++17,If Constexpr,如果我有一个有两个模板参数的类,有没有办法只在其中一个参数上分支If constexpr?在下面的示例中,我可以测试这两个参数是否匹配,但是我希望使用一种方法来匹配任何版本的MyTemplateClass,该版本的第一个参数是char #include <iostream> #include <type_traits> template<typename T,int32_t N> class MyTemplateClass { }; template&l

如果我有一个有两个模板参数的类,有没有办法只在其中一个参数上分支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
}

你太专注于新的语言特性而不是旧的技术。如果希望模板函数仅在给定的类型是MyTemplateClass的任何实例(其第一个参数为char)时有效,请编写:

template<int32_t N>
void DoStuff(const MyTemplateClass<char, N> &myObj)
{
  // test passed!
}

只有当额外的参数是类型参数,而不是值或模板参数时,这才有效。您可以使用auto将Args设置为值参数包,但它们不能是类型。C++没有机制来生成已知类型的模板参数。

你过于关注新语言特征而不是旧技术。如果希望模板函数仅在给定的类型是MyTemplateClass的任何实例(其第一个参数为char)时有效,请编写:

template<int32_t N>
void DoStuff(const MyTemplateClass<char, N> &myObj)
{
  // test passed!
}
只有当额外的参数是类型参数,而不是值或模板参数时,这才有效。您可以使用auto将Args设置为值参数包,但它们不能是类型。C++没有机制来生成已知类型的模板参数。

< P>如果DoStuff只接收MyTimePrCasLASS对象,则可以使用模板推导< /P>
template <typename T, std::int32_t N>
void DoStuff (MyTemplateClass<T, N> const & myObj)
{
    if constexpr ( std::is_same_v<char, T> )
    {
        // test passed!
    }
    else
    {
        // not passed
    }
}
第三种解决方案可以是提取N的自定义类型trait

如果DoStuff只接收MyTemplateClass对象,则可以使用模板推断

template <typename T, std::int32_t N>
void DoStuff (MyTemplateClass<T, N> const & myObj)
{
    if constexpr ( std::is_same_v<char, T> )
    {
        // test passed!
    }
    else
    {
        // not passed
    }
}
第三种解决方案可以是提取N的自定义类型trait


更好的是,它是SFINAE友好的,只有签名才能决定函数是否可行。是的,对于这个特定的例子,这是一个明智的方法,但在我的实际代码中它是不可行的。在不丢失问题本质的情况下简化问题是一个永恒的问题。更好的是,它是SFINAE友好的,只有签名才能决定函数是否可行。是的,对于这个特定的例子,这是一个明智的方法,但在我的实际代码中它是不可行的。试图简化你的问题而不失去它的本质是一个永恒的问题。@Nicolas-D'Oh!你说得对。纠正了,恢复了。谢谢。静态_assertfalse;格式错误,不需要诊断,实际上所有编译器diagnose@Barry-你说得对;但我只是从OP示例中复制了它;删除。@Nicolas-D'Oh!你说得对。纠正了,恢复了。谢谢。静态_assertfalse;格式错误,不需要诊断,实际上所有编译器diagnose@Barry-你说得对;但我只是从OP示例中复制了它;远离的。
template <typename>
struct getT;

template <typename T, std::int32_t N>
struct getT<MyTemplateClass<T, N>
 { using type = T };


template<typename C>
void DoStuff(const C& myObj)
{
    if constexpr ( std::is_same_v<typename getT<C>::type, char> )
    {
        // test passed!
    }
    else
    {
        // not passed
    }
}