gpt4 book ai didi

c++ - 在 C++ 中鸭子打字(通过其非类型模板参数的值专门化模板函数)

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:32:21 25 4
gpt4 key购买 nike

我做的是鸭子打字

template<bool b>
struct A{
static template<typename V> f1(V*, [other params]);
static template<typename V> f2(V*, [other params]);
};

template<> template<typename T>
void A<false>::f1(V*, [other params]){}

template<> template<typename T>
void A<true>::f1(V*, [other params]){
...some code...
}

template<int flags>
struct V{
void f(){
A<flags&Some compile time conditions>::f1 (this,[params]);
A<flags&Some compile time conditions>::f2 (this,[params]);
}
};

你觉得有没有更优雅的解决方案,不是Template class, function specialization(我不想为函数添加额外的参数)

我想做这样的事情

template<int X> struct C{
void f(){std::cout<<"C::f"<<std::endl;};
};


template<> struct C<0>{
};


template<int X> struct D{
C<X> c;

template<bool b>
void f();

void g(){
f<X!=0>();
}

};

template<>
template<int X>
void D<X>::f<true>{
c.f();
};

template<int X>
template<>
void D<X>::f<false>{};


int main(){
D<3> ch;
ch.g();

D<0> cn;
cn.g();

}

但这不是有效代码,我收到错误:template-id ‘f’ used as a declarator。

有没有办法通过非类型模板参数的值来特化模板函数?

最佳答案

template<>
template<int X>
void D<X>::f<true>(){
c.f();
};

template<int X>
template<>
void D<X>::f<false>(){};

那是非法的(所有尝试都是)。当您特化一个成员函数模板时,它的封闭类也必须特化。

但是,您可以通过将您的函数包装在一个模板化结构中来轻松克服这个问题,该结构将采用其模板参数。有点像

template <int X, bool B>
struct DXF;

template <int X>
struct DXF<X, true>
{
static void f() { // B is true!
}
};

template <int X>
struct DXF<X, false>
{
static void f() { // B is false!
}
};

并用 DXF<X, (X!=0)>::f() 调用它.

但是,您似乎只想专注于 X==0 .在这种情况下,您可以专注于:

template <>
void D<0>::f() {}

请注意 f在这种情况下,不是成员模板。


您可以选择的另一种选择是重载。你可以包装你的 int在一些模板的参数列表中,像这样:

template<int X> struct D{
C<X> c;

void f(std::true_type*) { ... true code ... }
void f(std::false_type_*) { ... false code ... }
void g(){
f((std::integral_constant<bool, X!=0>*)0);
}

注意 true_type 和 false_type 只是 typedefstd::integral_constant<bool, true>false , 分别

关于c++ - 在 C++ 中鸭子打字(通过其非类型模板参数的值专门化模板函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10603043/

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