首页 > 解决方案 > 推断基类的函数模板参数

问题描述

在这个例子中,我只需要为基类类型实例化模板函数。

struct A{ int i=0; };
struct A1:A{};
struct A2:A{};

struct B{ int i=1; };
struct B1:B{};
struct B2:B{};

template<typename T> uint32_t Checksum ( const T& t )
{
    // make sure we are not instantiating redundant functions
    static_assert(std::is_same<T,A>::value || std::is_same<T,B>::value,"");

    return t.i;
}
template uint32_t Checksum ( const A& t ); //this are actually no ops
template uint32_t Checksum ( const B& t ); //this are actually no ops

int main()
{
    A1 a1;
    A2 a2;
    B1 b1;
    B2 b2;
    Checksum<A>(a1);//ok
    Checksum<A>(a2);//ok
    Checksum<B>(b1);//ok
    Checksum<B>(b2);//ok
    Checksum(b2);  //error

    return 0;
}

是否可以强制模板类型推导到基类,理想情况下没有 C++17 推导指南,这样我就不必在调用时指定类型?

我还尝试显式实例化这些函数,想知道它们最终是否会在函数重载解析中发挥作用,但编译器没有选择它们。也许这有一些技巧。

标签: c++template-meta-programming

解决方案


怎么样:

foo.h

struct A{ int i=0; };
struct A1:A{};
struct A2:A{};

struct B{ int i=1; };
struct B1:B{};
struct B2:B{};

uint32_t Checksum ( const A& t );
uint32_t Checksum ( const B& t );

校验和.cpp

#include "foo.h"

template<typename T> uint32_t ChecksumImpl ( const T& t )
{
    // make sure we are not instantiating redundant functions
    static_assert(std::is_same<T,A>::value || std::is_same<T,B>::value,"");

    return t.i;
}
uint32_t Checksum ( const A& t ) { return ChecksumImpl (t);}
uint32_t Checksum ( const B& t ) { return ChecksumImpl (t);}

主文件

#include "foo.h"

int main()
{
    A1 a1;
    A2 a2;
    B1 b1;
    B2 b2;
    Checksum(a1);//ok
    Checksum(a2);//ok
    Checksum(b1);//ok
    Checksum(b2);//ok
}

推荐阅读