Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.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/9/loops/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
C++ 强制模板类中的特定类型_C++ - Fatal编程技术网

C++ 强制模板类中的特定类型

C++ 强制模板类中的特定类型,c++,C++,我的问题是: 我有一个模板化的类 Template <class T> SomeClass { void func1(T* arg1) //many methods using T void func2(T* arg1); } 模板 某类 { 无效函数1(T*arg1) //许多方法使用T 无效函数2(T*arg1); } 对于大多数情况,相同的类类型T被传递给类方法,它们在T的基础上工作(因此代码可以是泛型的)。对于某些特定情况,我想强制func2忽

我的问题是:

我有一个模板化的类

Template <class T>
SomeClass
{

    void func1(T* arg1)

    //many methods using T
    void func2(T* arg1);
}
模板
某类
{
无效函数1(T*arg1)
//许多方法使用T
无效函数2(T*arg1);
}
对于大多数情况,相同的类类型T被传递给类方法,它们在T的基础上工作(因此代码可以是泛型的)。对于某些特定情况,我想强制func2忽略T并使用我想要的,因此我可以执行以下操作:

void func1(T* arg1)
{

    T* ptr2;
    int* ptr1;
    if (a specific case)
    {
    SomeClass<int>::func2(ptr1);
    }
    else
    {
    func2(ptr2)//so it will assume ptr2 is of type T*
    }
}
void funct1(T*arg1)
{
T*ptr2;
int*ptr1;
如果(具体情况)
{
SomeClass::func2(ptr1);
}
其他的
{
func2(ptr2)//因此它将假定ptr2是类型T*
}
}
似乎不能马上起作用

最终工作代码(适用于面临类似问题的其他人)

#包括
模板
上课
{
公众:
无效函数1(T arg1);
模板
无效函数2(U arg1);
};
模板
void SomeClass::func1(T arg1)
{
如果(1)
{
func2(5);//U将推断为int
}
}
模板模板void SomeClass::func2(U arg1)
{
printf(“%d”,arg1);
}
int main()
{
c类;
c、 功能1(5.0);
}

类似的东西可能适合您:

template <class T>
class SomeClass
{
    void func1(T* arg1)

    template< typename U >
    void func2(U* arg1);
};
模板
上课
{
无效函数1(T*arg1)
模板
无效函数2(U*arg1);
};

模板
void SomeClass::func1(T*arg1)
{
T*ptr2;
int*ptr1;
如果(具体情况)
{
func2(ptr1);//U将推断为int
}
其他的
{
func2(ptr2);//U将推断为T
}
}

专门化模板。若要调用
SomeClass::func2
,需要类型为
SomeClass
的对象,除非
func2
是静态成员。要么找到创建此类对象的方法,要么将
func2
设置为静态成员。我无法将函数设置为静态,因为它使用某些类数据结构。另外,我不能重载(专门化),因为有很长的函数调用链,所以我必须专门化所有函数,看起来没有简单的方法,所以我必须在业务逻辑中寻找方法。谢谢大家的回复!!伟大的这实际上起了作用,注意一些语法变化:#包括模板类SomeClass{public:void func1(T arg1);模板void func2(U arg1);};模板void SomeClass::func1(T arg1){if(1){func2(5);//U将推断为int}}模板void SomeClass::func2(U arg1){printf(“%d”,arg1);}int main(){SomeClass c;c.func1(5.0);}我想知道为什么我不能在注释中按enter(换行),它只是提交帖子!!Ok shift enter有效,但现在它没有格式化代码!!
template <class T>
class SomeClass
{
    void func1(T* arg1)

    template< typename U >
    void func2(U* arg1);
};
template< typename T >
void SomeClass<T>::func1(T* arg1)
{
    T* ptr2;
    int* ptr1;
    if (a specific case)
    {
        func2(ptr1); // U will deduce to int
    }
    else
    {
        func2(ptr2); // U will deduce to T
    }
}