有什么方法可以部分实例一个C 模板

is there any way to partial instance a c++ template

本文关键字:一个 模板 实例 方法 什么      更新时间:2023-10-16

我有某种类型的模板,模板中的某些代码对所有类型都不有效,因此我想在需要时跳过它们。

struct T1
{
    int getData(){return 1;}
};
struct T2
{
    string getData(){return "string";}
};
struct T3
{
    // no getData()
};
template<typename T>
void printData(T param)
{
    cout << param.getData() << endl;
}
int main() {
    T1 t1;
    T2 t2;
    T3 t3;
    printData(t1);
    printData(t2);
    printData(t3);  // fails for T3 has no getData
}

我想知道有这样的方法(伪代码):

template<typename T>
void printData(T param)
{
    if(T != T3) // compile time check, instance on this condition
    {
        cout << param.getData() << endl;
    }
}

我尝试过std::is_same,但它不起作用

从C 17开始,您可以使用 if constexpr (!std::is_same_v<T, T3>),如Songyuanyao的答案中所建议的。

在C 11/C 14 i提出两种方式。

(1)标签派遣

template <typename T>
void printData (T param, std::true_type)
 { }
template <typename T>
void printData (T param, std::false_type)
 { std::cout << param.getData() << std::endl; }
template <typename T>
void printData (T param)
 { printData(param, std::is_same<T, T3>{}); }

(2)sfinae

// ever enabled
template <typename T>
void printData (T param, long)
 { }
// preferred (int instead of long) but enabled only
// when param support getData()
template <typename T>
auto printData (T param, int)
   -> decltype( param.getData(), void() )
 { std::cout << param.getData() << std::endl; }
template <typename T>
void printData (T param)
 { printData(param, 0); }

问题是,当TT3时,语句_true仍将在汇编中进行评估,这导致汇编错误。

您可以使用constexpr(自C 17)。

如果该值为true,则丢弃语句 - false(如果存在),则丢弃语句 - 真实。

,例如

if constexpr (!std::is_same_v<T, T3>)
{
    cout << param.getData() << endl;
}
相关文章: