【问题标题】:How to get the type of a template argument when it consists of a pointer?当模板参数由指针组成时,如何获取模板参数的类型?
【发布时间】:2015-10-30 01:30:14
【问题描述】:

如果 t 是 char* 或隐式或显式覆盖 operator char *() 的类,则第一个条件正确运行。第二个条件的目标是在类型 t 是指针并且 t 的取消引用类型可以转换为 char * 时执行括号内的代码。第二个条件在它应该为真时不成立(例如 t is char** 应该评估为真)。我究竟做错了什么?

仅供参考:我只关心指向可转换为 char *(如 char **)的东西的单个指针,而不关心 char ***,如果这有意义的话。

 t * Find(char * name)
            {
                if (std::is_convertible<t, char*>::value)
                {
                    return 0;
                }
                else if (std::is_convertible<typename std::remove_pointer<t>::type, char * >::value)
                {
                    return 0;
                }
                static_assert(false, "VSarray<T>::Find(char *), T is not convertable to a char *");
            }

【问题讨论】:

  • 如果您基于静态断言失败,则无论采用哪个分支,每次都会触发。
  • 你能提供一个完整的例子来说明你的问题吗?此外,ifs 的条件是编译时常量不会阻止您的 static_assert 始终触发。
  • @chris 你是对的,我一定是在重新测试之前改变了静态断言中的条件。
  • @melak47 我发现了我的问题我可以在条件括号内发布包括代码在内的完整功能,你知道我是在原始帖子下发布还是作为答案发布?
  • @user3141117,如果您自己解决了问题或有一个您认为对其他人有用的问答,我们非常欢迎您回答您自己的问题。不过,这并没有降低回答质量的标准。

标签: c++ templates typetraits


【解决方案1】:

按预期工作。静态断言确保类型 t(来自模板参数)可转换为 char *。该函数被分成两个函数,以允许在类型 t 是指向可转换为 char * 的类型的指针时取消引用。

    #define CHECK_TYPE_CONVERSION(TYPEFROM,TYPETO) std::is_convertible<TYPEFROM, TYPETO>::value
#define CHECK_POINTER_TYPE_CONVERSION(TYPEFROM,TYPETO) std::is_convertible<std::remove_pointer<TYPEFROM>::type,TYPETO>::value
    t * Find(char * name)
    {
        static_assert(CHECK_TYPE_CONVERSION(t,char*) || CHECK_POINTER_TYPE_CONVERSION(t,char*)
             , "T cannot be converted to a char *");
        if (CHECK_TYPE_CONVERSION(t,char*) == false)
            return this->FindFromPointer(name);
        for (unsigned int i = 0; i < this->arraySize_; i++)
        {
            char * str = (char*)this->arrayData_[i];
            if (strcmp(str, name) == 0)
                return &this->arrayData_[i];
        }
        return 0;

    }


private:
    t * FindFromPointer(char * name)
    {
        for (unsigned int i = 0; i < this->arraySize_; i++)
        {
            char * str = (char*)*this->arrayData_[i];
            if (strcmp(str, name) == 0)
                return &this->arrayData_[i];
        }
        return 0;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 2014-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    相关资源
    最近更新 更多