c++ - 我可以在 C++ 中部分编译模板函数吗

标签 c++ templates

我有一个判断模板类型是否为指针的函数。

template<class T>
struct is_pointer_struct { static const bool value = false; };

template<class T>
struct is_pointer_struct<T*> { static const bool value = true; };

template<class T>
bool is_pointer(T &var) {
    return is_pointer_struct<T>::value;
}

我有一个初始化函数。

template<class T>
void initialize(T &val) {
    if (is_pointer(val))
        val = NULL;
    else
        val = T();
}

很明显,当Tstring时,这段代码无法编译。有没有办法在 T 是指针类型时编译 val = NULL 并在 T 时编译 val = T() > 不是指针类型?

最佳答案

在您的特定情况下,您可以使用统一初始化,如 VTT说:

val = T{};

此外,标准库还提供 std::is_pointer .


作为对更一般性问题的回答“我如何在编译时分支?”:

  • 在 C++17 中,您只需将 if(...) 更改为 if constexpr(...):

    template<class T>
    void initialize(T &val) {
        if constexpr(is_pointer(val))
            val = nullptr;
        else
            val = T();
    }
    
  • 在 C++14 中,你 can implement your own static_if .

  • 在 C++03/11 中,您可以使用标签调度:

    template <typename T>
    void initialize_impl(std::true_type /* pointer */, T& val)
    {
        val = NULL;
    }
    
    template <typename T>
    void initialize_impl(std::false_type /* non-pointer */, T& val)
    {
        val = T();
    }
    
    template<class T>
    void initialize(T &val) { initialize_impl(std::is_pointer<T>{}, val); }
    

关于c++ - 我可以在 C++ 中部分编译模板函数吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45008597/

相关文章:

c++ - 模板化类的静态变量的多个定义

c++ - 跨 g++-nvcc 边界(包括内核)使用函数模板化代码

c++ - 如何创建动态数组数组(数组)?

C++ 生成器 [C++ 错误] sysmac.h(58) : E2040 Declaration terminated incorrectly

c++ - 为特定类型的所有应用程序创建一个基类是好的设计吗?

python - 在 Django 中,管理移动站点和桌面站点的最佳方法是什么?

c++ - 处理二进制文件 - 模板函数问题

c++ - 如何在每个成员的基础上覆盖类范围的 __declspec(dllexport) 注释?

C++ int64 * double == 减一

c++ - 类模板上的运算符重载